删除后指针本身会发生什么?

Ste*_*Kuo 13 c++ pointers

void doSomething()
{  
    TheObject *ptr = new TheObject;
    delete ptr;
    ptr = NULL;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

让我借用cplusplus.com中operator delete的字样:

释放由ptr指向的内存块(如果不为null),通过调用operator new释放先前分配给它的存储空间,并使该指针位置无效.

请帮助清除我的困惑:删除后指针本身会发生什么?指针本身确实有一个地址,对吗?所以在删除指向的块之后,指针本身呢?

在返回指针初始化的方法后,我可以说指针本身是自由的吗?指针本身是放在堆栈还是堆上?

das*_*ght 22

指针本身确实有一个地址和值.执行该指针后,指针的地址不会改变delete.分配给指针变量本身的空间保持不变,直到程序释放它(它可能永远不会发生,例如当指针位于静态存储区域时).标准没有说明指针的值会发生什么变化; 它说的是,在为指针指定有效值之前,不再允许使用该值.指针的这种状态称为悬空状态.

在你的程序中,指针ptrdelete完成之后但在执行ptr = NULL赋值之前悬空.之后它变成了一个NULL指针.

它自己的指针放在堆栈或堆上?

指针变量是一个常规变量.它的位置遵循与其他变量的放置相同的规则,即您可以将指针放在静态区域,自动区域(通常称为"堆栈")或动态内存(也称为"堆")中).在这种情况下,您将指定指针指针:

TheObject **ptrPtr = new TheObject*; // The pointer to a pointer is on the stack
*ptrPtr = new TheObject;             // The pointer to TheObject is in the heap
delete *ptrPtr; // The space for TheObject is released; the space for the pointer to TheObject is not
delete ptrPtr;  // Now the space for the pointer to TheObject is released as well
// The space for the pointer to pointer gets released when ptrPtr goes out of scope
Run Code Online (Sandbox Code Playgroud)

  • @Stephen:你被允许*为指针分配一个新值,但你不允许*读*旧值.这对于具有旧值的每个*指针都是如此,而不仅仅是那个特定指针 - 当指针上调用`delete`时,它们全部*无效. (2认同)