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

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

Мои вопросы:

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

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

1

Решение

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

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

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

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

Подумайте над тем, чтобы написать тип, который управляет аппаратным интерфейсом, позволяя пользователю просто удалить экземпляр, что может привести к нежелательному состоянию оборудования — так зачем вообще это разрешать? Да, в какой-то момент API может быть создан, чтобы абстрагироваться от этой трудности, но на каком-то базовом уровне необходимо раскрыть «хрупкую» функциональность.

= delete — это «новый» пуленепробиваемый способ предотвращения ошибок пользователя. В отличие от конструктора личных копий, его нельзя обойти с помощью ключевого слова friend. Он также имеет тенденцию к лучшему чтению, поскольку он последовательно сообщает пользователю кода, что эта функция недоступна. Насколько я понимаю, = удаление было введено в c ++ 11 в качестве замены «идиомы без копирования / без удаления».

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]