指针-删除 我2周前开始学习C++,现在我正在研究指针。为什么下面的代码没有按我预期的方式工作,删除后我在数组中看到相同的值。我认为数组将被删除,指针将指向堆中的某个随机整数,除非我写入dArray=NULL。有人能详细解释一下吗?我不知道我做错了什么。谢谢

指针-删除 我2周前开始学习C++,现在我正在研究指针。为什么下面的代码没有按我预期的方式工作,删除后我在数组中看到相同的值。我认为数组将被删除,指针将指向堆中的某个随机整数,除非我写入dArray=NULL。有人能详细解释一下吗?我不知道我做错了什么。谢谢,c++,arrays,pointers,C++,Arrays,Pointers,PS:我在Mac上使用Xcode 代码: delete不会更改指针的值。它只是意味着指针指向的内容不再合法访问(提供未定义的行为) 在很多情况下(比如你的),程序可能看起来很有效,但是改变了一些东西(比如添加另一个新的),它就会以奇怪和难以追踪的方式失败。。。删除后将指针设置为0至少会使故障更容易识别。删除数组只会将内存返回到运行时,但不会覆盖它。您可能不再使用它,这样做会调用未定义的行为 名称“delete”可能有点误导。它实际上并不删除任何内容,只是释放先前分配的内存,并调用它指向的对象的析

PS:我在Mac上使用Xcode

代码:


delete
不会更改指针的值。它只是意味着指针指向的内容不再合法访问(提供未定义的行为)


在很多情况下(比如你的),程序可能看起来很有效,但是改变了一些东西(比如添加另一个
新的
),它就会以奇怪和难以追踪的方式失败。。。删除后将指针设置为0至少会使故障更容易识别。

删除数组只会将内存返回到运行时,但不会覆盖它。您可能不再使用它,这样做会调用未定义的行为

名称“
delete
”可能有点误导。它实际上并不删除任何内容,只是释放先前分配的内存,并调用它指向的对象的析构函数(如果确实存在)。调用析构函数是
delete
free
之间的主要区别

理想情况下,当您试图访问释放的内存时,此程序应该崩溃
new
delete
现在变得非常罕见,尤其是在构造函数/析构函数之外。如果delete没有更改指针的值,它实际上会做什么?它是否删除指针指向的位置?如果是这样的话,我不应该得到一些随机数吗?我希望它不会指向“newint[5]”地址,而是至少指向其他地方。我仍然不太清楚。正如@Axel在下面所说的,它“将内存返回到运行时”-再次调用
new
可能会返回相同的内存,因此现在有两个指针指向相同的位置。
#include <iostream>
using namespace std;


int main() {

    int *dArray = new int[5];

    for(int i=0; i<5; i++) {
        dArray[i] = i*2;
    }

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

    delete [] dArray;

    // show array after deletion
    cout << "After deletion:" << endl;
    for(int i=0; i<5; i++) {
        cout << dArray[i] << endl;
    }

    return 0;
}
Show array:
0
2
4
6
8
After deletion:
0
2
4
6
8
Program ended with exit code: 0