#include <iostream>
using namespace std;
int main ()
{
int myarray [10];
int * ptr1;
ptr1 = new (nothrow) int [10];
cout << "ptr1 = " << ptr1 << endl;
delete [] ptr1;
cout << "ptr1 = " << ptr1 << endl;
int a = 4;
int * ptr2;
ptr2 = &a;
cout << "ptr2 = " << ptr2 << endl;
delete ptr2;
cout << "ptr2 = " << ptr2 << endl;
return 0;
}
输出
ptr1 = 0x9941008
ptr1 = 0x9941008
ptr2 = 0xbfca5cd4
问题:
1)为什么ptr1
的第二次打印仍然返回相同的值?内存被释放但指针保留了内存地址值?
2)为什么ptr2
的第二次打印不输出?
答案 0 :(得分:5)
delete
释放内存,但不会更改指针的值。但请注意,指针现在指向一个已释放的内存区域,因此在重置之前不应使用它。delete
运算符在堆上分配的new
个内存区域。答案 1 :(得分:2)
1)因为指针仍然指向同一位置。您正在打印指向的位置,而不是指向的位置。它描述了程序应该在哪里找到的东西。如果标记一个框,然后删除其内容,标签(指针)仍然存在。
2)您无法删除stack上分配的内容。
答案 2 :(得分:1)
删除指针不会改变指针的值。它基本上有两种效果:
如果你想观察被删除的intpointer,你需要替换globel运算符new()和operator delete()函数(这可能是一个有趣的实验,但通常你不想在生产代码中做任何事情)。