2011-01-10 5 views
0

Вот мой вопрос:производный деструктор вызывается перед базовой деструктор вызывает вопрос

Мой базовый класс имеет конструктор, который принимает в указатель класса, если этот указатель NULL, он знает, например, он сам и поддерживать его.

Проблема заключается в том, что в базовом деструкторе я должен отменить регистрацию с каким-то частным основанием. Так что происходит, когда я пытаюсь сделать вызов указателя класса в базовом деструкторе, а производный поддерживает его, он уже освобожден. Таким образом, возникает проблема. Что я мог сделать?

Благодаря

ответ

0

Если базовый класс создает экземпляр для указателя, почему она не может бесплатно это, а? Есть ли что-нибудь, что мешает вам перемещать свободный в базовый деструктор?

Всегда лучше быть последовательным с точки зрения того, кто делает то, что на определенном уровне иерархии - разделение одной и той же ответственности на нескольких уровнях иерархии, несомненно, приведет к таким проблемам. Не говоря уже о том, что если вы хотите создать другой класс, который наследуется от базы, вам придется повторно реализовать это управление и в новом классе, создав дублирование кода.

0

Порядок конструкторов и деструкторов в противоположна наследования; базовый конструктор вызывается перед любым его производным конструктором. После удаления происходит обратное: производный класс удаляется первым.

Чтобы решить вашу проблему, может ли базовый деструктор не проверить, не является ли его частный экземпляр NULL?

+0

Да, я могу это сделать, кроме того, что мне еще нужно вызвать функцию этого остроконечного объекта, иначе это вызовет проблемы – jmasterx

0

Из вашего описания я понимаю, что иногда производный класс будет отвечать за этот указатель, а иногда и базовый класс. Самое простое решение, которое я могу придумать, - добавить в базовый класс логическое значение, которое позволит вам отслеживать, кому принадлежит этот объект. Если базовый класс инициализировал указатель, установите для boolean значение true. Тогда ваш деструктор может проверить, кто владеет объектом, и, в свою очередь, должен ли он очищаться.

Лучшим решением будет использование boost: shared_ptr. Это абстракция указателя ссылок, которая автоматически очистит ваш объект, когда его последняя ссылка выходит за рамки. С этой абстракцией вам вообще не нужно беспокоиться о том, кто освобождает ваш указатель.

0

Базовый класс может реализовать функцию-член protected для выполнения очистки, тогда производный деструктор может вызвать эту вспомогательную функцию, прежде чем уничтожить ресурс.

0

Если ваш конструктор выделяет память, соответствующий деструктор отвечает за его освобождение. Если вы условно выделяете память, вам необходимо условно освободить ее. Булевский флаг поможет вам определить, произошло ли распределение.

Другим решением является использование подсчета ссылок. Во время выделения счетчик ссылок должен равняться 1. Если у другого класса есть интерес к объекту, он сохраняет указатель, увеличивая счетчик ссылок. Если класс больше не интересуется объектом, он уменьшает счетчик ссылок. Когда счетчик достигнет 0, объект должен быть удален. shared_ptr - это стандартная ссылка на C++, ссылающаяся на авто-указатель, которая очень хорошо работает в сложных ситуациях смешанного владения.