我2周前开始自己学习C ++,现在我正在研究指针。为什么下面的代码没有按照我期望的方式工作,删除后我在数组中看到相同的值。我认为数组将被删除,指针将指向堆中的一些随机整数,除非我写dArray = NULL。请问有人详细说明这一点,拜托?我不知道自己做错了什么。感谢。
PS:我在Mac上使用Xcode。
代码:
#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
答案 0 :(得分:4)
delete
不会更改指针的值。它只是意味着指针指向的东西不再合法访问(给出未定义的行为)。
在很多情况下(比如你的),程序看起来可能有效,但改变了一些东西(比如添加另一个new
),它会以奇怪的方式失败并且难以追踪......设置指针删除后至少0会使故障更容易识别。
答案 1 :(得分:1)
删除数组只会将内存返回给运行时,但不会覆盖它。您可能不再使用它,这样做会调用未定义的行为。
答案 2 :(得分:1)
名称“delete
”可能有点误导。它实际上并没有删除任何东西 - 只需释放先前分配的内存并调用它指向的对象的析构函数(如果存在的话)。调用析构函数是delete
和free
之间的主要区别。