为什么无法删除指向单个整数内存位置的指针?

时间:2012-01-02 17:52:24

标签: c++ dynamic-memory-allocation

#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的第二次打印不输出?

3 个答案:

答案 0 :(得分:5)

  • delete释放内存,但不会更改指针的值。但请注意,指针现在指向一个已释放的内存区域,因此在重置之前不应使用它。
  • 你的程序肯定会在第二次打印之前崩溃,因为你试图释放一个尚未在堆上分配的指针。您只能使用delete运算符在堆上分配的new个内存区域。

答案 1 :(得分:2)

1)因为指针仍然指向同一位置。您正在打印指向的位置,而不是指向的位置。它描述了程序应该在哪里找到的东西。如果标记一个框,然后删除其内容,标签(指针)仍然存在。

2)您无法删除stack上分配的内容。

答案 2 :(得分:1)

删除指针不会改变指针的值。它基本上有两种效果:

  1. 它会摧毁指向的物体。显然,摧毁一个没有效果的
  2. 它宣布指向内存现在未使用内存系统
  3. 如果你想观察被删除的intpointer,你需要替换globel运算符new()和operator delete()函数(这可能是一个有趣的实验,但通常你不想在生产代码中做任何事情)。