В следующем коде я использую объект-оболочку для временного хранения некоторых вещей из базы данных в памяти. Мой вопрос простой:
Могу ли я быть уверен, что деструктор вызван? Меня особенно беспокоят случаи, когда а) testCondition
истинно, и функция рано возвращается из внутренней области видимости, в которой был построен tempObj
б) во время выполнения этой функции возникает некоторая ошибка времени выполнения (которая обнаруживается на более высоком уровне)
(В качестве побочного вопроса: это хороший способ временно сохранить некоторые данные? В моем приложении someFunc()
является функцией сохранения / экспорта текущей базы данных.)
class TempStore
{
public:
TempStore() {/* delete some stuff from a db and store this in memory*/}
~TempStore() {/* write this stuff back into the db*/}
};
void someFunc(bool testCondition)
{
TempStore tempObj = TempStore();
// some code
if (testCondition)
return; //early return
// some more code
}
3 ответа
Деструктор автоматического объекта будет вызван, когда программа покинет область видимости объекта. Это включает возврат из функции (ранний или иной) и выход через исключение - до тех пор, пока исключение обрабатывается. В случае исключения он вызывается во время раскрутки стека перед обработкой исключения.
Он может не вызываться в некоторых случаях, в том числе:
- уходя по телефону
longjmp
; это дает неопределенное поведение; - выход через исключение, которое не обрабатывается; не указано, разматывается ли стек.
- завершение программы (например, вызов
exit
или подача сигнала, вызывающего завершение).
Деструктор будет вызываться, если программа не взорвется из-за ошибки сегмента, отключения электроэнергии или чего-то еще. Простого возврата из функции на раннем этапе или генерации исключения недостаточно, чтобы остановить работу деструктора.
Однако этот дизайн немного ошибочен, поскольку запись в базу данных - это операция, которая может завершиться ошибкой, а создание исключения из деструктора - довольно плохая идея.
Да, деструктор будет вызван. Каждый объект, созданный в стеке, будет правильно уничтожен, если вы вернетесь раньше. Если генерируется исключение, деструктор будет вызван после того, как выполнение программы достигнет блока catch.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
TempStore
будет вызываться при возврате функцииsomeFunc()
, предполагая "нормальное" выполнение программы (например, без сбоев или ошибок сегментации). Это называется идиомой "Приобретение ресурсов — это инициализация" (RAII) и является краеугольным камнем современного С++.