关于c++:issue-pure-virtual-method-called-虚函数调用段错误

5次阅读

共计 763 个字符,预计需要花费 2 分钟才能阅读完成。

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)禁止多级继承。
正文完
 0