任何使用的方案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)
归档时间: |
|
查看次数: |
4946 次 |
最近记录: |