c++ - 什么会导致在构造子进程期间调用父进程的析构函数?

标签 c++ segmentation-fault construction destruction

在此处输入代码我在代码的一个奇怪部分中看到了段错误,在使用 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/

相关文章:

C 指针段错误崩溃

c++ - 什么是 int() 调用?

object - 有谁知道为什么 TWEAK 例程在 BUILD 例程之前被命中?

c++ - 无法访问重复类的方法

c++ - 从模板类调用函数时形成无限循环,请任何人解释

c++ - 定义为 "_end[LEN]"的数组在 C/C++ 中导致段错误

C:从文件中读取未知数量的未知长度的行

c++ - 尝试通过 Eclipse-AVR 使用 Arduino 的 HardwareSerial

c++ - 获取指向对象成员函数的指针

c++ - 引用您声明的同一个变量