当您将静态库与来自两个不同共享库(在Linux上)的全局或静态对象链接到相同的可执行文件时,可能会导致一个奇怪的情况。每个共享的lib对象都向构造函数和析构函数插入调用,因此您将有一个对象和两个对同一对象的构造函数和析构函数的调用(实际上您将有2个对象映射到相同的地址)。
当你的应用在第二析构函数中崩溃时,你可能会发现问题。 如果你是NULL,你永远不会知道有问题。
你的问题:由于上述以外的问题,我想你应该截然不同的两种类型的指针: 请参见下面的类:
class A{
obj *x, *y;
A(){
x = new obj;
y = NULL
}
~A(){
delete x;
if(y)delete y; // the `if` here will save the calling and returning run time when NULL.
}
void RecicleX(){
delete x;
x = new obj;
}
void InitY(){
assert(y==NULL); //illegal to call init when already
y = new obj;
}
void TermY(){
assert(y); //illegal to call term when already inited
delete y;
y = NULL; //prevent crush in dtor if called after...
}
};
X始终存在,所以没有需要检查它,无需将其清空。你可能存在也可能不存在,所以我认为你应该在删除后清空它。 (你也许会想也知道目前的状态,像assert
)
来源
2013-11-26 11:07:41
SHR
我不同意这是一个很好的做法。双删除指针几乎总是应用程序中的逻辑错误,并且在删除后将指针设置为空可隐藏该错误。如果您没有将其设置为空,则该应用可能会崩溃,这是件好事。 – JohannesD
你有没有使用情况下,将指针设置为0实际上有助于任何事情?我以前见过这种模式,但除非您将引用导出为指针,否则我无法看到它。 – juanchopanza
@JohannesD但是'双删除'在哪里呢?将NULL指向指针不会释放内存。 '如果你没有将它设置为null,那么应用程序可能会崩溃,这是一件好事情 - 将它设置为null也会崩溃脚趾应用程序,不是吗? –