例如,我有一个具有保留计数的类和一个可以在保留计数为 0 时删除 self 的释放方法:
class MyClass{
public:
void retain(){
this->retainCount++;
}
void release(){
this->retainCount--;
if(this->retainCount==0){
delete this;
}
printf("release called");
MyClass::deleteCount++;
FileOutputStream* fio=new FileOutputStream();
fio->generateLog();
delete fio;
EmailUtils::sendEmailAboutMemoryUsage();
}
protected:
int retainCount;
static int deleteCount;
}
删除对象后,我可能需要执行一些代码:
printf("release called");
MyClass::deleteCount++;
FileOutputStream* fio=new FileOutputStream();
fio->generateLog();
delete fio;
EmailUtils::sendEmailAboutMemoryUsage();
我的问题是,如果删除后的代码块不需要对此进行任何访问,那么在删除对象后继续执行代码是否安全?
这是有关此问题的isocpp常见问题解答的条目。
只要你小心,一个物体自杀是可以的(不是邪恶的)(删除这个)。
基本上,如果你在delete this
之后没有调用任何成员函数或访问任何成员变量,这可能没问题。
有关详细信息,请参阅链接。
这是完全定义的行为,前提是您可以确定您的对象已分配了 new
。
在这种情况下,它会调用析构函数并释放与对象关联的内存,使对象this
悬空指针。由于删除后无法访问它,因此代码中没有直接问题。
但是你至少应该在该方法中添加一个强烈的通知,因为即使安全,你也应该警告未来的维护者两个现在牢不可破的规则:
- 不要在
delete this
后访问非静态方法this
或任何成员变量 - 从不创建该类的非动态分配对象
是的,它是安全的。删除 this
时不会删除代码。但这是一件奇怪的事情。我的重击规则是:"谁创造了某样东西,就应该摧毁它"。我不喜欢在一个地方(在代码中)创建东西(对象、数组等)并在其他地方销毁它们。这可能会导致错误和内存泄漏,并使程序的可读性和可维护性降低。