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

Is it safe to do something after "delete this" if the "somethings" does not require to access "this"?

例如,我有一个 class,它有一个保留计数和一个释放方法,如果保留计数为 0,则可以删除自身:

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();

我的问题是,如果delete后的代码块不需要this的任何访问权限,删除对象后继续执行代码是否安全?

是的,它很安全。当您删除 this 时,代码不会被删除。但这是一件奇怪的事情。我的原则是:"whoever creates something, should destroy it"。我不喜欢在某个地方(在代码中)创建事物(对象、数组……)并在别处销毁它们。这可能会导致错误和内存泄漏,并降低您的程序的可读性和可维护性。

Here's an entry of the isocpp FAQ about this issue.

As long as you’re careful, it’s okay (not evil) for an object to commit suicide (delete this).

基本上,如果您在 delete this 之后不调用任何成员函数或访问任何成员变量,它 可能 没问题。

详情见link。

这是完美定义的行为前提是您可以确定您的对象已分配给 new

在这种情况下,它会调用析构函数并释放与使 this 成为悬空指针的对象关联的内存。由于您在删除后不会访问它,因此您的代码中不会立即出现问题。

但是你至少应该在该方法中添加一个强烈的通知,因为即使安全,你也应该警告未来的维护者这两个现在牢不可破的规则:

  • 不要访问this,也不要在delete this
  • 之后访问非静态方法的任何成员变量
  • 永远不要创建那个 class
  • 的非动态分配对象