В следующем коде я использую объект-оболочку для временного хранения некоторых вещей из базы данных в памяти. Мой вопрос простой:

Могу ли я быть уверен, что деструктор вызван? Меня особенно беспокоят случаи, когда а) 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
mr_T 10 Сен 2014 в 18:53

3 ответа

Лучший ответ

Деструктор автоматического объекта будет вызван, когда программа покинет область видимости объекта. Это включает возврат из функции (ранний или иной) и выход через исключение - до тех пор, пока исключение обрабатывается. В случае исключения он вызывается во время раскрутки стека перед обработкой исключения.

Он может не вызываться в некоторых случаях, в том числе:

  • уходя по телефону longjmp; это дает неопределенное поведение;
  • выход через исключение, которое не обрабатывается; не указано, разматывается ли стек.
  • завершение программы (например, вызов exit или подача сигнала, вызывающего завершение).
6
Mike Seymour 10 Сен 2014 в 15:03

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

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

2
Mankarse 10 Сен 2014 в 15:02

Да, деструктор будет вызван. Каждый объект, созданный в стеке, будет правильно уничтожен, если вы вернетесь раньше. Если генерируется исключение, деструктор будет вызван после того, как выполнение программы достигнет блока catch.

2
Nikita 10 Сен 2014 в 15:06