【问题标题】:C++ Why do I get unexpected zero-initialize for member? [duplicate]C++ 为什么我会意外地对成员进行零初始化? [复制]
【发布时间】:2017-09-09 10:57:45
【问题描述】:

阅读how new works in C++ 我尝试了以下代码:

#include <iostream>

using namespace std;
struct A { int m; }; // POD
int main()
{
    A* a = new A;
    cout<<"A m="<<a->m<<endl;
    return 0;
}

并且输出总是“A m=0”。 为什么它不显示残值,我怎样才能让它这样做?

附加信息:在 Ubuntu 16.04 上使用 5.4.0 20160609。尝试使用 -std=C++ 03、98 和 11 标准进行编译

【问题讨论】:

  • 是什么让 0 的残差比 42 少?你也应该在“发布模式”下编译。
  • 成员变量的内容是indeterminate。以任何方式使用它,除了初始化它是 C++ 中的undefined behavior
  • 未定义的行为是未定义的,停止推理。这真的没有建设性。
  • 这是程序中第一次使用new。会有什么样的“剩余价值”?请注意,大多数操作系统会在运行之间清除内存,因此您的程序无法窥探前一个程序所做的事情。

标签: c++ memory initialization new-operator


【解决方案1】:

m 的值未指定,可能是 13370,如您的情况。这并不意味着 0 不是残值(它与任何其他数字一样残值),您永远不应该依赖它。

在实践中可能发生的情况是,您正在调试中进行编译,而编译器在将请求的字节提供给您之前将它们归零。

【讨论】:

  • 我也尝试添加 -O3 标志并得到相同的结果编辑:尝试多次运行它
猜你喜欢
  • 2013-10-14
  • 2021-12-16
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多