Когда я должен предотвратить неявное разрушение? Как это работает?

Я знаю, что я могу объявить деструктор =delete или private, чтобы программа не могла неявно удалять объект в конце области видимости. Я также знаю, что если он частный, у меня может быть функция-член, которая может явным образом вызвать деструктор, когда я его назову: void kill() { this–>~A(); }

Мои вопросы:

  • Почему я хотел бы предотвратить неявное разрушение? Просьба привести пример

  • Что бы сделать =delete? Убеждается ли, что деструктор никогда не работает? Таким образом, объект будет существовать вечно вне его сферы?

Ответ 1

Идиомы, такие как частный деструктор, обычно используются, чтобы другие программисты не выполняли определенные операции с вашим типом. Частный деструктор, в частности, предотвращает следующее:

  • Объявление типа вашего экземпляра в стеке
  • Ручное удаление экземпляра вашего типа с помощью ключевого слова delete
  • Ручные деструкторные вызовы

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

  • Вызвать factory функции для уничтожения экземпляров этого типа (обычно в сочетании с частными конструкторами). Предоставление дополнительного контекста для строительства и уничтожения может обеспечить возможности оптимизации или предотвратить неправильное использование API, когда пакетная операция намного эффективнее, чем выделение "один".
  • Не выделяйте какие-либо экземпляры этого типа (возможно, это singleton)

Рассмотрите возможность записи типа, который управляет аппаратным интерфейсом, позволяя пользователю просто удалять экземпляр, который может оставить аппаратное обеспечение в нежелательном состоянии - так почему же это разрешить? Да, в какой-то момент API можно сконструировать, чтобы отвлечься от этой трудности, но на каком-то базовом уровне нужно "разоблачить" функциональность.

= delete - это "новый" пуленепробиваемый способ предотвращения ошибки пользователя. В отличие от частного конструктора копирования его нельзя обойти по ключевому слову "friend". Он также имеет тенденцию читать лучше, поскольку он постоянно информирует пользователя о коде, что эта функция недоступна. Мое понимание заключается в том, что = delete было введено в С++ 11 в качестве замены "no copy/no delete idioms".