如果"somethings"不需要访问"this",那么在"delete this"后做某事是否安全?



例如,我有一个具有保留计数的类和一个可以在保留计数为 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 时不会删除代码。但这是一件奇怪的事情。我的重击规则是:"谁创造了某样东西,就应该摧毁它"。我不喜欢在一个地方(在代码中)创建东西(对象、数组等)并在其他地方销毁它们。这可能会导致错误和内存泄漏,并使程序的可读性和可维护性降低。

最新更新