【问题标题】:C++ Create array on heap without initializing itC ++在堆上创建数组而不初始化它
【发布时间】:2018-04-11 20:11:51
【问题描述】:

当您创建这样的数组时(在堆栈上):

float array[5];

然后循环遍历元素

for (int i = 0; i < 5; i++) {
    std::cout << array[i] << " ";
}

它给出了这个

1.4013e-45 0 0 0 5.88052e-39

这表明它还没有被初始化。 但是,当我这样做时(在堆上):

float* array = new float[5];

输出

0 0 0 0 0

如何在不初始化的情况下在堆上创建数组?

【问题讨论】:

  • 这样的分配也不会初始化数组。 01.4013e-45 一样是不确定的值。
  • 有了这个:float* array = new float[5]; 什么都没有初始化。但是,有了这个:float* array = new float[5](); 现在是的,它们已被初始化。不要让一些零迷惑你:)
  • 纯运气都是0s
  • 我用 2147483647 个值完成了它,但只得到了零。我的记忆是空的吗?
  • 读取未初始化的变量是未定义的行为。这里的所有都是它的。该程序完全无效,您不能指望任何事情

标签: c++ arrays heap-memory stack-memory


【解决方案1】:

它不会初始化值。运行此代码表明。

float* array = new float[5];
for (int i = 0; i < 5; i++) {
    array[i] = 5;
    std::cout << array[i] << " ";
}
std::cout << std::endl;
delete[] array;
float* array2 = new float[5];
for (int i = 0; i < 5; i++) {
    std::cout << array2[i] << " ";
}

然后输出

5 5 5 5 5 
0 0 5 5 5

或类似的东西。

【讨论】:

  • 您对array2 的使用会调用未定义的行为。你的程序毫无意义。允许编译器生成它喜欢的任何东西
  • 是的,但我想要一种获得未定义行为的方法。我以为它会将值设置为零,但这个实验表明它没有。
  • 一旦您调用 UB,所有赌注都关闭。允许编译器做任何事情——包括忽略你的代码、做你想做的事情、修改其他代码来做不同的事情(见time travel)等等。简单的事实上,一旦你调用 UB,试图得出关于你的程序将做什么的结论是没有意义的——它只是 undefined——不再是一个有效的 C++ 程序。
  • 我的措辞不是很好。我的意思是出于性能原因我不想将数组初始化为任何内容。
【解决方案2】:

结果

new float [5];

不修改内存,但堆内存可能已经有值,或者被实现初始化为具有特定值。

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 2017-05-27
    • 2015-01-05
    • 2011-06-02
    • 2023-04-09
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多