我可以从析构函数的类方法调用它吗
Can i call destructor from its class method?
我有一个像下面这样的线程类
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中使用,因为每个对象都有一个释放函数,该函数会递减引用计数的私有整数,如果它达到零,则会删除整个对象
- 使用用户定义的参数调用future/async并调用类方法
- 有没有办法从同一类中的函子调用类方法?
- 是否可以基于类模板的参数调用类方法和全局方法
- 为什么从 DLL 调用类方法需要虚拟说明符?
- 通过该类中定义的指针调用类方法时的语法
- 从另一个类调用类方法
- 如何在不创建实例的情况下调用类方法
- 在不使用对象的情况下调用类方法
- 通过循环std::map调用类方法
- 我必须创建一个对象来调用类方法吗?或者我可以只键入类名吗
- 在main中调用类方法,更改不会在类方法之外保留?
- C++ - 调用<类方法没有匹配函数>
- C++:从非类函数调用类方法
- 通过包装对象上的函数指针调用类方法出错
- 在同一个方法中调用类方法
- 使用std::string调用类方法
- 在自身上调用类方法
- c++从类内调用类方法
- 使用Boost基本截止时间计时器来调用类方法
- 将lambdas传递给std::线程并调用类方法