enter code here
Я вижу segfaults в странной части моего кода, и после использования valgrind казалось, что проблема была в деструкторе родителя, вызываемого во время конструирования дочернего элемента. Это странно, так что запустил GDB, и действительно, я вижу конструктор вызываемого дочернего объекта, вызываемый конструктор parent, а затем деструктор parent, вызываемый до выхода из дочернего конструктора. Я сделал новую сборку, увидел то же самое.
Я предполагаю, что это невозможно, и происходит что-то смешное, но я понятия не имею, что это может быть или как использовать 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, это может быть неправильно. Таким образом, ошибка все еще может быть чем-то совершенно другим.