2

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 }

*进一步编辑* 我还要提到没有显式调用,deletegdb回溯显示父析构函数正上方的调用是子构造函数,所以我不认为这是其他一些代码以某种方式清理它。

4

1 回答 1

2

子类构造函数调用其基类的析构函数只有一个原因:失败。

因此,您的问题可能是由于在孩子的构造中某处引发的异常所致。这会导致堆栈展开,并且所有已构建的对象都被破坏。由于是子类的构造函数调用了其所有父类的构造函数,因此在异常清理期间调用其析构函数的也是子类的构造函数。

但是,不要对gdb产生的源代码行过分重视,它可能是错误的。所以这个错误可能仍然是完全不同的东西。

于 2014-04-24T17:44:21.847 回答