我有一个像bellow
的Thread类class Thread {
public:
Thread();
~Thread();
void start();
void stop();
}
所以我需要从stop()方法调用析构函数,这是一个很好的方法吗?
答案 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()
之后没有成功的成员通话。
但是,如果您正在存储已创建工作程序的每个实例,那么这将不再适用。