1.问题形容:
在做一个分布式存储的服务器。服务器在某些异样敞开的场景下,会在析构时,报错:
pure virtual method called, terminate called without an active exception。
服务器析构时,会调用上面这行代码:
`tx->Commit();` // std::shared_ptr<SeGhBacken> tx;
其申明为:
基类:
class SeGhDB {
public:
virtual int Commit();
}
申明:
class SeGhBacken : public SeGhDB {
int Commit() override;
}
之后服务器会段谬误,并报错:
pure virtual method called, terminate called without an active exception
2.问题剖析:
段谬误,根本都是内存问题。个别是指针被置空,或是指针所指对象曾经生效,此处也不例外。
这个谬误的起因为:在运行期,子类对象被以前析构,或者基本未被结构进去。
调用这个函数实现的时候,编译器就调用到了基类的虚函数,如果基类的虚函数未实现,则会报上述谬误。
3.问题解决
对象提前被析构或未被结构,通常是因为多线程环境下,线程调度引起的。遇到上述问题,应该首先查看线程内资源的结构和回收情况。
题主遇到的这个问题,正是由此导致。在本我的项目线程池实现中,遇到退出信号,会摈弃后续工作,导致对象没有被正确结构,从而造成了这个问题,在调整了线程池参数后,问题失去解决。
4.总结:
此问题个别解决方案:
(1)应用new和delete治理对象内存,本人手动管制对象生命周期;
(2)线程内实现对象全生命周期治理,在一个线程内实现对象的结构、调用和析构;
(3)对于同一个线程内的对象,要恪守谁申请,谁开释的内存治理标准;
(4)禁止多级继承。
发表回复