undefined-behavior相关内容
我有以下代码: #include #include using namespace std; int main(){ complex三角洲; complex mc [4] = {0}; for(int di = 0; di cout
..
我很好奇初始化列表和序列点。我刚才读到,初始化列表中的求值顺序是从左到右。如果是这样,那么在评价点之间必须有某种顺序点,我错了吗?那么说的是以下有效的代码?是否有任何引起未定义行为的内容? int i = 0; struct S { S(...){} operator int(){return i; } }; int main(){ i = S {++ i,++
..
请考虑以下代码: int main() { int count = 0; int arrInt [2] = {count ++,count ++}; return 0; } 如果我们使用 clang -std = c ++ 03 会产生以下警告( live example ): 警告:多次无序修改'count'[-Wunsequenced]
..
根据ISO C ++,取消引用空指针是未定义的行为。我的好奇心是,为什么?为什么标准已经决定声明它未定义的行为?这个决定背后的理由是什么?编译器依赖?似乎没有,因为根据C99标准,据我所知,它是很明确的。机器依赖?任何想法? 解决方案 定义一致行为解除引用NULL指针需要编译器在每个解引用之前检查NULL指针CPU架构。这对于一个为速度而设计的语言来说是不可接受的。 它只修复了一个更
..
结果很多无辜的东西是未定义的行为在C + +。例如,一旦非空指针 delete 'd 甚至打印出指针值是未定义的行为。 泄漏肯定是坏的。 解决方案 内存泄漏。 没有未定义的行为。这是完全合法的泄漏内存。 未定义的行为:是动作标准具体不想定义和离开到实现,以便它是灵活的执行某些类型 内存管理定义明确。 如果您动态分配内存,但不释放内存。然后内存仍然是应用程序的管
..
我们知道,有符号整数溢出是未定义的行为。但有一些有趣的C ++ 11 cstdint 文档: 有符号整数类型的宽度分别为8,16,32和64位,分别没有填充位和对负值使用2的补码(仅当实现直接支持类型时提供) 请参阅link 这里是我的问题:因为标准明确说明 int8_t , int16_t , int32_t 和 int64_t 负数是2的补码,这些类型未定义的行为? 编
..
正在编译: #include int main() { for(int i = 0; i std :: cout
..
在 C ++常见问题这一段中,使用 delete this 构造。列出了4个限制。 限制1到3看起来相当合理。但为什么是限制4那里,我“不能检查它,与另一个指针,比较它与NULL,打印,铸造,做任何事情与它”? 我的意思是这个是另一个指针。为什么我不能 reinterpret_cast 它到 int 或调用 printf c $ c>以输出其值? 解决方案 在删除指针后不能做任
..
到目前为止,我找不到如下推论: int * ptr; * ptr = 0; 是未定义的行为。 所有,有5.3.1 / 1表示 * 意指间接,将 T * 转换为 T 。 然后经常引用3.7.3.2/4说,对非空指针使用解除分配函数会使指针无效,并且后来对无效指针的使用是UB。 如何在上面的代码中推导出UB? 解决方案 第4.1节
..
我正在研究核心常量表达式* 中允许的内容, 段落中的 jtc1 / sc22 / wg21 / docs / papers / 2012 / n3485.pdf“>草案C ++标准,其中说: 条件表达式是一个核心常量表达式,除非它包含以下之一作为潜在求值的子表达式(3.2),但未评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子表达式不考虑[注意:重载操作符调用一个
..
请考虑此主题是以下主题的续集: 上一期付款 未定义的行为和序列点 让我们重温这个有趣的和复杂的表达式(斜体的短语取自上面的主题* smile *): i + = ++ i; 我们说这会调用未定义的行为。我假设当说这个时,我们隐含地假设 i 的类型是其中一个内置类型。 如果 i 的类型是用户定义的类型,该怎么办?说它的类型是 Index ,后面定
..
请考虑这一点: #include using namespace std; int main(void) { const int a1 = 40; const int * b1 =& a1; char * c1 =(char *)(b1); * c1 ='A'; int * t =(int *)c1; cout
..
首先,使用 delete 为任何分配 new [] 的是根据C ++标准的未定义的行为。 在Visual C ++ 7中,这样的配对可能会导致两个后果之一。 ]'ed有微不足道的构造函数和析构函数VC ++只是使用 new 而不是 new [] > delete 只是调用“allocate memory”, delete 只要调用“自由内存”。 如果类型new []'ed有一个非
..
C ++标准在3.3.2“声明点”中包含了一个半知名的名称查找示例: int x = x; 这会自行初始化 x 是原始类型)是未初始化的,因此具有不确定的值(假设它是一个自动变量)。 这是否是未定义的行为? 根据4.1“Lvalue-to-rvalue转换”,对未初始化的值执行Lvalue-to-Rvalue转换是未定义的行为。右侧 x 是否进行此转
..
我的印象是,访问联合成员而不是最后一个是UB,但我似乎找不到一个坚实的参考(除了答案 因此,它是未定义的行为吗? 解决方案 混淆是C明确允许通过联合类型冲突,而C ++( c ++ 11 )没有这样的权限。 c11 的问题 6.5.2.3结构和联合成员 95)如果用于读取union对象的内容的成员不同于最后用于 的成员在对象中存储一个值,该值的对象表示的适当部分被
..
如中所述,初始化是否包含左值到右值转换?是 int x = x; UB? C ++标准在部分有一个惊人的例子3.3.2 int 使用自己的不确定值初始化的声明点: int x = 12; {int x = x; } 这里,第二个x被初始化为自己的(不确定)值。 - end example ] 这个问题的Johannes答案表示未定义行为,
..
我已经写了一个简单的,工作的tetris游戏,每个块作为一个类单块的实例。 class SingleBlock { public: SingleBlock(int,int); 〜SingleBlock(); int x; int y; SingleBlock * next; }; class MultiBlock { public: MultiB
..
请考虑以下代码: #include struct foo { //(a): void bar(){std :: cout ba
..
C ++程序员应该知道的所有常见的未定义的行为是什么? 说: a [i] = i ++; 解决方案> Pointer 取消引用 NULL 指针 使用指向其生命周期已结束的对象的指针(例如,堆栈分配的对象或删除的对象) li> 解除尚未明确初始化的指针 执行指针运算,产生数组外边界(上方或下方)的结果。 将指针指向超
..
什么是“序列点”? 未定义的行为和序列点之间的关系是什么? 我经常使用有趣和令人费解的表达式,如 a [++ i] = i; ,使自己感觉更好。为什么我要停止使用它们? 如果您已阅读此文件,请务必访问后续问题
..