Есть ли разница между вызовом функции-члена из листового класса внутри или вне тела деструктора? - PullRequest
1 голос
/ 29 сентября 2011

У меня есть конкретный случай, который трудно выделить здесь во фрагменте кода, но я могу объяснить это ...

У меня есть класс A: public B, а A имеет указатель на член некоторого типа foo * f. В виртуальном деструкторе для A у меня есть что-то вроде:

A::~A() { shutdown(); }

где выключение не виртуально и выглядит примерно так: void A :: shutdown () {delete f;}

оказывается, во время выполнения это дает мне «чисто виртуальный метод с именем terminate, вызываемый без активного исключения Aborted (core dumped)», но если я удаляю shutdown () из тела деструктора и вызываю его напрямую, а затем позволяю Деструктор бежит ... Я больше не понимаю ...

Что может быть причиной такого поведения? Я пытался перейти с GDB, но он огромен, и я даже не уверен, что искать. Любые идеи будут очень цениться!

Ответы [ 2 ]

0 голосов
/ 29 сентября 2011

Если у A есть и метод выключения И указатель f, вообще не вызывайте shutdown (). Просто удалите f в деструкторе напрямую.

0 голосов
/ 29 сентября 2011

Либо shutdown - это чисто виртуальная функция где-то в дереве наследования, либо она вызывает другую функцию-член, которая является чисто виртуальной, где-то в дереве наследования. Прямо или косвенно, но это то, что происходит.

Проверьте путь выполнения, чтобы увидеть, где сделан вызов, и избавиться от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...