enter code here
我在我的代码的一个奇怪部分看到了段错误,并且在使用 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回溯显示父析构函数正上方的调用是子构造函数,所以我不认为这是其他一些代码以某种方式清理它。