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.仅仅因为智能指针存在,每个人都无法使用它.
我们可能正在使用旧式指针的系统.一天,我们无法将所有这些转换为智能指针.
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
,你会得到一个堆栈溢出的析构函数会失控递归.