我可以从类方法中调用析构函数吗?

时间:2013-11-27 07:45:55

标签: c++ destructor

我有一个像bellow

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

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

5 个答案:

答案 0 :(得分:6)

delete this;

但要小心。您不应再使用已删除的对象this和非静态成员。

另一种方法是调用析构函数

~Thread();

但问题是,为什么需要调用析构函数?!这不符合逻辑。您可以编写代码来管理私有方法中的资源并调用它。

答案 1 :(得分:2)

您可以使用以下语法:

~Thread();

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

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

答案 2 :(得分:0)

没有。

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

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

特别针对你的情况,我不确定你为什么要从stop函数中删除线程,如果有一些管理线程的机制 - 它应该从外部分配/解除分配线程,而不是线程本身停止时释放自己的记忆。 (线程应如上所述执行清理,但不强制调用自己的析构函数)

答案 3 :(得分:0)

没有。不要这样做。

让线程拥有另一个对象。

当您致电stop()时,线程应告知其所有者已准备好将其删除(请确保您自行锁定,以便所有者在完成之前不会删除)。然后让对象的所有者进行适当的清理(希望在不久的将来)。

答案 4 :(得分:0)

我说不要在成员函数中调用delete this,而是通知所有者该对象已准备好被删除。

我有一项服务可以创建工作人员,但在他们创建之后并不关心他们。

从服务类中:

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

然后在工人阶级内:

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

所有服务类都是创建新的worker,因此除了每次创建新worker时丢弃的指针w之外,没有对worker的引用。

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

但是,如果您正在存储已创建工作程序的每个实例,那么这将不再适用。