删除此私有析构函数

Vid*_*dak 2 c++ memory oop destructor this

我一直在考虑delete this在c ++中可能的用法,我看过一次使用.

因为你delete this只能在一个对象在堆上时说,我可以使析构函数变为私有,并完全阻止在堆栈上创建对象.最后,我可以通过delete this在充当析构函数的随机公共成员函数中说明来删除堆上的对象.我的问题:

1)为什么我要强制在堆上而不是在堆栈上创建对象?

2)除此之外还有其他用途delete this吗?(假设这是合法使用它:))

Mik*_*our 7

任何使用的方案delete this都有点危险,因为任何调用函数的人都会留下一个悬空指针.(当然,当您正常删除对象时也是如此,但在这种情况下,很明显该对象已被删除).然而,有些合法的案例需要一个对象来管理自己的生命周期.

它可以用来实现讨厌的,侵入式的引用计数方案.您将拥有"获取"对象的引用,阻止它被删除,然后在完成后"释放"它的功能,如果没有其他人获取它,则删除它,类似于:

class Nasty {
public:
    Nasty() : references(1) {}

    void acquire() {
        ++references;
    }
    void release() {
        if (--references == 0) {
            delete this;
        }
    }
private:
    ~Nasty() {}
    size_t references;
};

// Usage
Nasty * nasty = new Nasty; // 1 reference
nasty->acquire();          // get a second reference
nasty->release();          // back to one
nasty->release();          // deleted
nasty->acquire();          // BOOM!
Run Code Online (Sandbox Code Playgroud)

我更喜欢std::shared_ptr用于此目的,因为它是线程安全的,异常安全的,适用于任何类型而无需任何显式支持,并且在删除后阻止访问.

更有用的是,它可以在事件驱动的系统中使用,在该系统中创建对象,然后管理自己,直到他们收到一个事件,告诉他们不再需要它们:

class Worker : EventReceiver {
public:
    Worker() {
        start_receiving_events(this);
    }    
    virtual void on(WorkEvent) {
        do_work();
    }
    virtual void on(DeleteEvent) {
        stop_receiving_events(this);
        delete this;
    }
private:
    ~Worker() {}
    void do_work();
};
Run Code Online (Sandbox Code Playgroud)