Удаление объекта в C++ без создания его через new, или можно ли удалять объекты взятием адреса (&)?
BaseClass BaseClassObj;
Объект создаётся на стеке и будет уничтожен(просто сдвинут указатель на вершину стека по факту) при выходе из области видимости(функции), попытки удалить его через delete будут приводить к UB, т.е. сказать, что произойдёт нельзя, да и незачем.
> Объект BaseClassObj будет удален только по завершению программы.BaseClass baseClassObj;
Здесь создаётся объект на стеке. Имя — это просто имя объекта. Никаких указателей здесь нет. Как только мы покинем блок (любым образом: штатно выйти, goto, break, выброс аварии — кроме «жёсткого» выхода из программы функциями типа exit), у объекта автоматически исполнится деструктор и прямой вызов не нужен. Блок, то есть подпрограмму BaseClassPresentation.BaseClass *BaseClassObjPtr = new BaseClass(2);
Здесь BaseClassObjPtr это имя указателя (а не указатель на указатель). Объект создаётся в динамической памяти, и его придётся уничтожать вручную. Многое в Си++11 сделали для того, чтобы подобные объекты уничтожались не вручную, а всё теми же автодеструкторами.std::unique_ptr<BaseClass> BaseClassObjUp = new BaseClass(2);Это уже маленький объект со своим деструктором. А в деструкторе находится delete, и он сработает, как только программа выйдет из своего блока.
То, что вы хотите, иногда бывает нужно, и я вижу этому две причины.
1. Объект управляет какими-то сложными и важными ресурсами: большим количеством памяти, файлом, мьютексом… И этот важный ресурс бывает нужно освободить раньше, чем наступит деструктор. Например, у любого файлового потока есть функция close() — она закрывает файл.
2. У нас сложное и хитрое управление памятью, когда приходится использовать placement new и прямой вызов деструктора. Скажу честно, не использовал никогда. Как и 90% программистов на Си++.