C++ “之后做某事安全吗?”;删去这句话;如果;“有些事”;不需要访问;这是什么;?

C++ “之后做某事安全吗?”;删去这句话;如果;“有些事”;不需要访问;这是什么;?,c++,memory-management,undefined-behavior,retain-cycle,C++,Memory Management,Undefined Behavior,Retain Cycle,例如,我有一个类,它有一个retain count和一个release方法,如果retain count为0,它可以删除self: class MyClass{ public: void retain(){ this->retainCount++; } void release(){ this->retainCount--; if(this->retainCount==0){ de

例如,我有一个类,它有一个retain count和一个release方法,如果retain count为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();

我的问题是,如果删除后的代码块不需要对此进行任何访问,那么在删除对象后继续执行代码是否安全?

是,它是安全的。删除此时,代码不会被删除。但这是一件奇怪的事情。我的重击规则是:“谁创造了什么,谁就应该摧毁它”。我不喜欢在一个地方(代码中)创建东西(对象、数组等等),然后在其他地方销毁它们。这可能会导致错误和内存泄漏,并降低程序的可读性和可维护性。

只要你小心,一个物体自杀是可以的(不是邪恶的)(删除这个)

基本上,如果在
删除此
之后没有调用任何成员函数或访问任何成员变量,则可能是正常的


有关详细信息,请参阅链接。

这是完美定义的行为,前提是您可以确保您的对象已分配了
新的

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

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

  • 不要访问
    ,也不要在
    删除此
    后访问非静态方法的任何成员变量
  • 永远不要创建该类的非动态分配对象

你说的“安全”是什么意思?你是在问这是一种未定义的行为吗?或者它可能会在某个特定平台上爆炸?在我看来,隐藏的答案似乎是“使用
std::shared_ptr
。确实如此,这实际上是Microsoft的组件对象模型(COM)使用的方法。