使用delete []后元素仍然保留

cur*_*eek 0 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;
}
Run Code Online (Sandbox Code Playgroud)

INPUT:1 2 14 4 5和OUTPUT:1 2 14 4 5 NEW MEM 0 0 14 4 5

请解释为什么我没有得到OUTPUT:1 2 14 4 5 NEW MEM 0 0 0 0 0

Lig*_*ica 6

也许你期望这new int[5]会将新的内存块初始化为零.

好吧,它没有!这就是那个.C++没有做你没有要求的事情,因为如果你不想要它们,那就是不必要的性能损失.

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


或许您可能期望将delete[]初始化的内存块初始化为零.

这也不会发生.归零对象并没有任何意义,就像它们即将消失一样.同样,C++不会在这样的事情上浪费时间.


您可以进行零初始化,new int[5]()但我没有在这里看到这么做的充分理由.