以下是 C++ 编程中未定义行为最常见的原因。请注意,标准中规定所有这些都会导致未定义行为,并且在编写程序时应不惜一切代价避免这些行为。带符号整数溢出;取消对空指针、大小为零的“new”分配返回的指针、尚未明确初始化的指针或数组末尾位置之外的指针的引用;使用已超出范围或已被删除的对象的指针;执行导致结果超出数组边界的指针运算;将指针转换为不兼容的对象…… 阅读更多
唯一安全的方法是在溢出发生之前进行检查。虽然有一些检查整数溢出的hacky方法。因此,如果您旨在检测无符号 int 加法中的溢出,您可以检查结果是否实际上小于任何一个被加的值。例如,unsigned int x, y; unsigned int value = x + y; bool overflow = value < x; // 或者 "value < y" 也应该有效这是因为如果 x 和 y 都是无符号 int,如果相加并且溢出,它们的值不可能大于它们中的任何一个,因为…… 阅读更多
这是因为 C++ 不进行边界检查。像 Java 和 Python 这样的语言有边界检查,因此如果您尝试访问越界元素,它们会抛出错误。C++ 的设计原则是它不应该比等效的 C 代码慢,而 C 不会进行数组边界检查。因此,如果您尝试访问此越界内存,则程序的行为是未定义的,因为这在 C++ 标准中写明。一般来说,每当遇到未定义行为时,任何事情都可能发生。应用程序可能会崩溃,可能会冻结,可能会…… 阅读更多
当声明一个用 C 语言实现/编译的函数时,需要在 C++ 中使用 extern "C"。使用 extern "C" 让编译器知道我们要使用 C 语言的命名和调用约定。这会导致编译器在我们的 C++ 代码中进入 C 语言模式。这是必要的,因为 C++ 编译器在符号表中对名称的处理方式与 C 编译器不同,因此行为也与 C 编译器不同。