在此处输入代码
我在代码的一个奇怪部分中看到了段错误,在使用 valgrind 后,问题似乎是在构建子级期间调用了父级的析构函数。这很奇怪,所以启动了 gdb,实际上,我看到子对象的构造函数被调用,父对象的构造函数被调用,然后在子构造函数退出之前调用父对象的析构函数。我做了一个新的构建,看到了同样的事情。
我认为这是不可能的,并且正在发生一些有趣的事情,但我不知道那可能是什么,也不知道如何使用 gdb 来确定它是什么。 Valgrind 只是在稍后告诉我,当我尝试使用父对象时,我正在执行无效读取,因为相关内存在子对象的构造过程中被删除了!
很难分解出有问题的代码来给出一个工作示例,但我可以尝试提供任何其他有帮助的细节。使用 gcc 4.7.2。
* 编辑 * 这是继承链的草图:
class MKTimer: public MKSelfRegistrar<MKTimer>, public MKMakeable1<std::string>, public MKObject, public Timer;
MKObject is the offending parent.
MKTimer(const std::string& timer): Timer(timer) {}
MKObject() { some stuff here that doesn't seem relevant }
* 进一步编辑 *
我还要提到,没有显式调用 delete
并且 gdb 回溯显示父析构函数上方的调用是子构造函数,所以我不认为这是其他代码清理不知怎么的。
最佳答案
子类构造函数调用其基类的析构函数只有一个原因:失败。
因此,您的问题可能是由于子项构造中的某个地方引发了异常。这会导致堆栈被展开,并且所有已经构造的对象都被破坏。由于是子类的构造函数调用其所有父类的构造函数,因此在异常清理期间,子类的构造函数也调用其析构函数。
但是,不要太看重 gdb 生成的源代码行,它可能是错误的。所以这个错误可能仍然有很大的不同。
关于c++ - 什么会导致在构造子进程期间调用父进程的析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23275355/