undefined-behavior相关内容

初始化列表中的多个突变是否未定义行为?

我很好奇初始化列表和序列点。我刚才读到,初始化列表中的求值顺序是从左到右。如果是这样,那么在评价点之间必须有某种顺序点,我错了吗?那么说的是以下有效的代码?是否有任何引起未定义行为的内容? int i = 0; struct S { S(...){} operator int(){return i; } }; int main(){ i = S {++ i,++ ..
发布时间:2016-10-11 21:51:35 C/C++开发

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

根据ISO C ++,取消引用空指针是未定义的行为。我的好奇心是,为什么?为什么标准已经决定声明它未定义的行为?这个决定背后的理由是什么?编译器依赖?似乎没有,因为根据C99标准,据我所知,它是很明确的。机器依赖?任何想法? 解决方案 定义一致行为解除引用NULL指针需要编译器在每个解引用之前检查NULL指针CPU架构。这对于一个为速度而设计的语言来说是不可接受的。 它只修复了一个更 ..
发布时间:2016-10-11 21:48:02 C/C++开发

是内存泄漏“未定义的行为”类问题在C ++?

结果很多无辜的东西是未定义的行为在C + +。例如,一旦非空指针 delete 'd 甚至打印出指针值是未定义的行为。 泄漏肯定是坏的。 解决方案 内存泄漏。 没有未定义的行为。这是完全合法的泄漏内存。 未定义的行为:是动作标准具体不想定义和离开到实现,以便它是灵活的执行某些类型 内存管理定义明确。 如果您动态分配内存,但不释放内存。然后内存仍然是应用程序的管 ..
发布时间:2016-10-11 21:31:31 C/C++开发

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

我们知道,有符号整数溢出是未定义的行为。但有一些有趣的C ++ 11 cstdint 文档: 有符号整数类型的宽度分别为8,16,32和64位,分别没有填充位和对负值使用2的补码(仅当实现直接支持类型时提供) 请参阅link 这里是我的问题:因为标准明确说明 int8_t , int16_t , int32_t 和 int64_t 负数是2的补码,这些类型未定义的行为? 编 ..
发布时间:2016-10-11 21:13:07 C/C++开发

为什么我不应该尝试使用“this” “删除此”之后的值

在 C ++常见问题这一段中,使用 delete this 构造。列出了4个限制。 限制1到3看起来相当合理。但为什么是限制4那里,我“不能检查它,与另一个指针,比较它与NULL,打印,铸造,做任何事情与它”? 我的意思是这个是另一个指针。为什么我不能 reinterpret_cast 它到 int 或调用 printf c $ c>以输出其值? 解决方案 在删除指针后不能做任 ..
发布时间:2016-10-11 21:04:45 C/C++开发

C ++标准在什么地方说dereferencing未初始化的指针是未定义的行为?

到目前为止,我找不到如下推论: int * ptr; * ptr = 0; 是未定义的行为。 所有,有5.3.1 / 1表示 * 意指间接,将 T * 转换为 T 。 然后经常引用3.7.3.2/4说,对非空指针使用解除分配函数会使指针无效,并且后来对无效指针的使用是UB。 如何在上面的代码中推导出UB? 解决方案 第4.1节 ..
发布时间:2016-10-11 20:51:06 C/C++开发

为什么常量表达式有未定义行为的排除?

我正在研究核心常量表达式* 中允许的内容, 段落中的 jtc1 / sc22 / wg21 / docs / papers / 2012 / n3485.pdf“>草案C ++标准,其中说: 条件表达式是一个核心常量表达式,除非它包含以下之一作为潜在求值的子表达式(3.2),但未评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子表达式不考虑[注意:重载操作符调用一个 ..
发布时间:2016-10-11 20:25:56 C/C++开发

未定义的行为和序列点重新加载

请考虑此主题是以下主题的续集: 上一期付款 未定义的行为和序列点 让我们重温这个有趣的和复杂的表达式(斜体的短语取自上面的主题* smile *): i + = ++ i; 我们说这会调用未定义的行为。我假设当说这个时,我们隐含地假设 i 的类型是其中一个内置类型。 如果 i 的类型是用户定义的类型,该怎么办?说它的类型是 Index ,后面定 ..
发布时间:2016-10-11 20:23:04 C/C++开发

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

首先,使用 delete 为任何分配 new [] 的是根据C ++标准的未定义的行为。 在Visual C ++ 7中,这样的配对可能会导致两个后果之一。 ]'ed有微不足道的构造函数和析构函数VC ++只是使用 new 而不是 new [] > delete 只是调用“allocate memory”, delete 只要调用“自由内存”。 如果类型new []'ed有一个非 ..
发布时间:2016-10-11 20:21:35 C/C++开发

初始化是否需要进行左值到右值转换?是`int x = x;`UB?

C ++标准在3.3.2“声明点”中包含了一个半知名的名称查找示例: int x = x; 这会自行初始化 x 是原始类型)是未初始化的,因此具有不确定的值(假设它是一个自动变量)。 这是否是未定义的行为? 根据4.1“Lvalue-to-rvalue转换”,对未初始化的值执行Lvalue-to-Rvalue转换是未定义的行为。右侧 x 是否进行此转 ..
发布时间:2016-10-11 20:04:33 C/C++开发

访问不活动的联合成员和未定义的行为?

我的印象是,访问联合成员而不是最后一个是UB,但我似乎找不到一个坚实的参考(除了答案 因此,它是未定义的行为吗? 解决方案 混淆是C明确允许通过联合类型冲突,而C ++( c ++ 11 )没有这样的权限。 c11 的问题 6.5.2.3结构和联合成员 95)如果用于读取union对象的内容的成员不同于最后用于 的成员在对象中存储一个值,该值的对象表示的适当部分被 ..
发布时间:2016-10-11 19:51:53 C/C++开发

C ++标准是否改变了在C ++ 14中使用不确定值和未定义的行为?

如中所述,初始化是否包含左值到右值转换?是 int x = x; UB? C ++标准在部分有一个惊人的例子3.3.2 int 使用自己的不确定值初始化的声明点: int x = 12; {int x = x; } 这里,第二个x被初始化为自己的(不确定)值。 - end example ] 这个问题的Johannes答案表示未定义行为, ..
发布时间:2016-10-11 19:51:10 C/C++开发

C ++程序员应该知道的所有常见的未定义的行为是什么?

C ++程序员应该知道的所有常见的未定义的行为是什么? 说: a [i] = i ++; 解决方案> Pointer 取消引用 NULL 指针 使用指向其生命周期已结束的对象的指针(例如,堆栈分配的对象或删除的对象) li> 解除尚未明确初始化的指针 执行指针运算,产生数组外边界(上方或下方)的结果。 将指针指向超 ..
发布时间:2016-10-11 19:47:34 C/C++开发