我可以从析构函数的类方法调用它吗

Can i call destructor from its class method?

本文关键字:调用 类方法 析构函数 我可以      更新时间:2023-10-16

我有一个像下面这样的线程类

class Thread {
public:
  Thread();
  ~Thread();
  void start();
  void stop();
}

所以我需要从stop()方法调用析构函数,这是一个好方法吗?

从技术上讲是的,但要小心,您不应该再使用已删除的对象、this和非静态成员:

delete this;

你也可以调用析构函数:

~Thread();

然而,在设计良好的代码中,可以避免这些类型的自毁。

Er’body表示不要从成员函数中调用delete this,而是通知所有者对象已准备好删除。

我有一项服务,它创造了工人,但在他们被创造出来后并不关心他们。

来自服务类别:

Worker* w;
[...]
while (1) {
  [...]
  w = new Worker();
  [...]
}

然后从工人阶级内部:

void Worker::doWork() {
  [...]
  [...]
  delete this;
}

服务类所做的只是生成新的工作者,因此在工作者类之外,除了每次创建新工作者时都会丢弃的指针w之外,没有对工作者的引用。

在这种情况下,我认为在worker没有更多工作要做时调用delete this是有意义的(只要delete this;doWork()中的最后一个语句,并且在doWork()之后没有后续的成员调用。

然而,如果您存储已创建worker的每个实例,那么这将不再是真的。

您可以使用以下语法:

~Thread();

但是我怀疑你是否真的需要C++的这个特性。也许你应该更好地设计你的课。

显式调用析构函数的一个法律案例是在自定义内存管理器中,您不能使用delete运算符来删除对象。

否。

我认为从类代码内部调用析构函数是不好的做法。如果你需要在析构函数中进行清理,你应该使用cleanup()函数来封装这项工作,并在相关的情况下从stop和析构函数调用该函数。

显然,这样的解决方案需要保持对象的状态,以了解它是否已经清理,从而避免不必要的工作和多次释放可能不再属于您的资源。

特别是对于您的情况,我不确定您为什么要从停止函数中删除线程,如果有某种机制管理线程的话——它应该从外部分配/释放线程,而不是在停止时释放自己内存的线程本身。(线程应该如上所述执行清理,但不强制调用自己的析构函数)

否。不要这样做。

将线程归另一个对象所有。

当你调用stop()时,线程应该告诉它的所有者它已经准备好被删除了(确保你锁定了自己,这样所有者就不会在你完成之前删除)。然后让对象的所有者进行适当的清理(希望在不久的将来)。

是的,你可以。该功能在COM中使用,因为每个对象都有一个释放函数,该函数会递减引用计数的私有整数,如果它达到零,则会删除整个对象