检查未解除分配的指针

cpp*_*der 2 c++ pointers memory-management

假设指针对象正在一个点上分配,并且它正被返回到不同的嵌套函数.有一次,我想在检查它是否有效或已经由某人解除分配后取消分配该指针.

是否有任何保证可以使用?

if(ptr != NULL)
   delete ptr;
Run Code Online (Sandbox Code Playgroud)

要么

if(ptr)
   delete ptr;
Run Code Online (Sandbox Code Playgroud)

此代码不起作用.它总是给出分段错误

#include <iostream>
class A
{
    public:
    int x;
     A(int a){ x=a;}
     ~A()
     { 
          if(this || this != NULL) 
              delete this;
     }
};
int main()
{ 
    A *a = new A(3);
    delete a;
    a=NULL;
}
Run Code Online (Sandbox Code Playgroud)

编辑

每当我们谈论指针时,人们就会开始询问,为什么不使用Smart Pointers.仅仅因为智能指针存在,每个人都无法使用它.

我们可能正在使用旧式指针的系统.一天,我们无法将所有这些转换为智能指针.

Luc*_*ore 6

if(ptr != NULL) delete ptr;

要么

if(ptr) delete ptr;

两者实际上相当于,也是一样的delete ptr;,因为调用delete上一个NULL指针是保证工作(如,它什么都不做).

如果它ptr是一个悬垂的指针,它们不能保证工作.

含义:

int* x = new int;
int* ptr = x;
//ptr and x point to the same location
delete x;
//x is deleted, but ptr still points to the same location
x = NULL;
//even if x is set to NULL, ptr is not changed
if (ptr)  //this is true
   delete ptr;   //this invokes undefined behavior
Run Code Online (Sandbox Code Playgroud)

在您的特定代码中,您将获得异常,因为您delete this在析构函数中调用,而析构函数又会再次调用析构函数.既然this是从来没有NULL,你会得到一个堆栈溢出的析构函数会失控递归.

  • 你不需要测试 - `delete`一个null的指针工作正常.见http://stackoverflow.com/questions/4190703/is-it-safe-to-delete-a-null-pointer (2认同)