Удалить объект с защищенным деструктором - PullRequest
1 голос
/ 08 января 2012

Я довольно плохо знаком с управлением памятью в C ++.Я прочитал Должен ли каждый класс иметь виртуальный деструктор? и нашел ответ:

Каждый абстрактный класс должен иметь либо

  • защищенный деструктор, либо
  • виртуальный деструктор

Если у вас есть общедоступный не виртуальный деструктор, это бесполезно, поскольку позволяет пользователям через этот указатель удалять производный объект.Поскольку, как мы все знаем, это неопределенное поведение.

Для класса, не предназначенного для удаления через указатель на него, нет никаких причин иметь виртуальный деструктор.Это не только приведет к бесполезной трате ресурсов, но, что более важно, даст неверный намек пользователям.Подумайте, какой дурной смысл в том, чтобы дать std :: iterator виртуальный деструктор.

Так что теперь у меня есть защищенный деструктор (я не наследую от класса).

В другом классе, хотя у меня есть указатель на этот объект.В моем конструкторе я даю указателю «новый» объект этого класса, в моем destrcutor я бы хотел его уничтожить.

Как мне это сделать?Если деструктор не защищен, я получаю ошибку сегмента (которую я не совсем понимаю, но я все равно понимаю, что программирование плохое).Если деструктор защищен, я не знаю, как удалить объект.

1 Ответ

3 голосов
/ 08 января 2012

Вы пропускаете термин "абстрактный" в блоке выше.«абстрактный» означает, что вы не должны иметь объект класса.Если у вас есть объекты из класса, он почти всегда должен иметь открытый деструктор.

...