我的代码是:
#include <iostream>
using namespace std;
int main() {
// your code goes here
int* a;
a = new int[5];
for(int i = 0; i < 5; i++)
cin>>a[i];
for(int i = 0; i < 5; i++)
cout<<a[i]<<" ";
delete[] a;
cout<<"NEW MEM ";
a = new int[5];
for(int i = 0; i < 5; i++)
cout<<a[i]<<" ";
return 0;
}
输入:1 2 14 4 5和 输出:1 2 14 4 5 NEW MEM 0 0 14 4 5
请说明为什么我没有输出:1 2 14 4 5 NEW MEM 0 0 0 0 0
答案 0 :(得分:6)
也许您期望new int[5]
将对新的内存块进行零初始化。
嗯,不是!就是这样。 C ++不会做您没有要求的事情,因为如果您不想要它们,那将是不必要的性能损失。
看起来您的新存储块恰好发生与上一个存储块位于同一位置,现在您(部分)观察最后一个存储块留下的值。从技术上讲,这些值是未指定的,读取它们意味着您的程序具有未定义的行为。您必须为这些新的数组元素提供自己的新值,然后才能将它们用于任何真正有意义的事情。
或者您可能期望delete[]
将即将死去的内存块初始化为零。
也不会发生。将对象清零真的没有意义,就像它们将要消失一样。同样,C ++不会在此类事情上浪费时间。
You can make the zero-initialisation happen和new int[5]()
,但我认为没有足够的理由这样做。
答案 1 :(得分:2)
原因:
a = new int[5];
您(默认)不会将数组初始化为零,也不会初始化以下注释中指出的任何其他值。您仅在免费存储上为五个int
分配空间,并打印出undefined behavior的未初始化数组的值。
将数组值初始化为0
:
a = new int[5] {0};
或:
a = new int[5] {};
或提供所有元素的值:
a = new int[5] { 1, 2, 14, 4, 5 };