即使使用delete []也保留元素

时间:2018-10-05 10:20:00

标签: c++

我的代码是:

#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

2 个答案:

答案 0 :(得分:6)

也许您期望new int[5]将对新的内存块进行零初始化。

嗯,不是!就是这样。 C ++不会做您没有要求的事情,因为如果您不想要它们,那将是不必要的性能损失。

看起来您的新存储块恰好发生与上一个存储块位于同一位置,现在您(部分)观察最后一个存储块留下的值。从技术上讲,这些值是未指定的,读取它们意味着您的程序具有未定义的行为。您必须为这些新的数组元素提供自己的新值,然后才能将它们用于任何真正有意义的事情。


或者您可能期望delete[]将即将死去的内存块初始化为零。

也不会发生。将对象清零真的没有意义,就像它们将要消失一样。同样,C ++不会在此类事情上浪费时间。


You can make the zero-initialisation happennew 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 };