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释放先前分配给它的存储空间,并使该指针位置无效.
请帮助清除我的困惑:删除后指针本身会发生什么?指针本身确实有一个地址,对吗?所以在删除指向的块之后,指针本身呢?
在返回指针初始化的方法后,我可以说指针本身是自由的吗?指针本身是放在堆栈还是堆上?
在阅读了很多关于此的帖子后,我想澄清下一点:
A* a = new A();
A* b = a;
delete a;
A* c = a; //illegal - I know it (in c++ 11)
A* d = b; //I suppose it's legal, is it true?
Run Code Online (Sandbox Code Playgroud)
所以问题是关于使用已删除指针的副本的值.
我读过,在c ++ 11中读取a导致未定义行为的价值 - 但是读取它的价值b呢?
尝试读取指针的值(注意:这与解除引用它不同)会导致自C++ 14以来的实现定义行为,其中可能包括生成运行时错误.(在C++ 11中它是未定义的行为) 删除后指针本身会发生什么?