Tag: 未定义的行为

为什么解引用空指针是未定义的行为?

根据ISO C ++,取消引用空指针是未定义的行为。 我的好奇心是,为什么? 为什么标准决定宣布它未定义的行为? 这个决定背后的理由是什么? 编译器依赖? 似乎没有,因为根据C99标准,据我所知,这是明确的。 机器依赖? 有任何想法吗?

这是无限的recursionUB吗?

在C ++ 11中,作为一个没有副作用的死循环,下面的程序是UB: int main() { while (true) {} } 以下也是UB吗? void foo() { foo(); } int main() { foo(); } 从这两个scheme的标准引用将是理想的。

在初始化中使用新声明的variables(int x = x + 1)?

我偶然发现了一个让我感到惊讶的行为: 写作时: int x = x+1; 在一个C / C ++程序(甚至更复杂的expression式涉及新创build的variablesx)我的gcc / g ++编译没有错误。 在上面的情况中,X是1之后。 请注意,以前的声明中没有variablesx的范围。 所以我想知道这是否是正确的行为(甚至可能在某些情况下是有用的),或者只是一个parsing器与我的gcc版本或gcc一般。 顺便说一句:以下不起作用: int x++;

为什么我不应该在“删除这个”之后使用“this”值?

在这个C ++ FAQ的使用中delete this构造。 列出了4个限制。 限制1至3看起来相当合理。 但为什么我不能检查它,把它和另外一个指针比较,把它与NULL比较,打印出来,然后用它来做任何事情呢? 我的意思是this是另一个指针。 为什么我不能reinterpret_cast到一个int或调用printf()来输出它的值?

C ++中有符号整数溢出仍然是未定义的行为?

正如我们所知,有符号整数溢出是未定义的行为 。 但在C ++ 11 cstdint文档中有一些有趣的cstdint : 有符号整数types,其宽度分别为8,16,32和64位,没有填充位, 2的补码用于负值 (只有在实现直接支持该types时才提供) 请参阅链接 这里是我的问题:因为标准明确指出,对于int8_t , int16_t , int32_t和int64_t负数是2的补码,仍然是这些types的溢出未定义的行为? 编辑我检查了C ++ 11和C11标准,这里是我发现: C ++ 11,§18.4.1: 标题定义了与C标准中的7.20相同的所有函数,types和macros。 C11,§7.20.1.1: typedef名称intN_t指定宽度为N,无填充位和二进制补码表示的有符号整数types。 因此, int8_t表示宽度恰好为8位的带符号整数types。

如何配对新的与删除可能导致内存泄漏只?

首先,根据C ++标准,对于分配了new[]东西,使用delete是未定义的行为。 在Visual C ++ 7中,这样的配对可能会导致两个后果之一。 如果new []'ed具有简单的构造函数和析构函数,VC ++只是使用new而不是new[]并且使用delete来工作正常 – new调用“allocate memory”, delete只调用“free memory”。 如果new []'ed有一个不平凡的构造函数或析构函数,那么上面的技巧就无法完成了 – VC ++ 7必须调用正确数量的析构函数。 所以它在数组前面加上一个size_t存储元素的个数。 现在,由new[]返回的地址指向第一个元素,而不是指向块的开始。 所以如果使用delete ,它只会调用第一个元素的析构函数,并调用与“allocate memory”返回的地址不同的地址的“空闲内存”,这会导致HeapFree()中的一些错误指示,我怀疑是指堆腐败。 然而,在这里和那里,人们可以阅读在new[]之后使用delete导致内存泄漏的错误语句。 我怀疑任何大小的堆腐败比仅仅为第一个元素调用析构函数的事实重要得多,可能没有调用的析构函数没有释放堆分配的子对象。 在new[]之后如何使用delete可能导致某些C ++实现中的内存泄漏?

如果a没有被初始化,是a a还是aa未定义的行为?

考虑这个程序: #include <stdio.h> int main(void) { unsigned int a; printf("%u %u\n", a^a, aa); return 0; } 它是不确定的行为? 从表面上看, a是一个未初始化的variables。 所以这指向未定义的行为。 但是a^a和aa对于aa的所有值都等于0 ,至less我认为是这样的。 有没有可能有某种方式来争辩这种行为是有明确定义的?

(为什么)正在使用未初始化的variables未定义的行为?

如果我有: unsigned int x; x -= x; 很明显,在这个expression式之后x 应该是零,但是在我看来,他们说这个代码的行为是不确定的,不仅仅是x的值(直到减法之前)。 两个问题: 这个代码的行为确实没有定义? (例如,代码可能会在兼容的系统上崩溃[或更糟])? 如果是这样的话,那么为什么 C说这个行为是不确定的,当时这个x应该是零呢? ie这里没有定义行为的优点是什么? 显然,编译器可以简单地使用它在variables中被认为“方便”的任何垃圾值,并且可以按预期工作……这种方法有什么问题?