2013-12-05 4 views
2

у меня есть такой код, как это:уборка после исключения

class myclass 
{ 
    myclass() 
    { 
     // doing some init here 
     } 
    ~myclass() 
    { 
     // doing some important clean up here 
    } 
    void Do() 
    { 
      // doing some work which may throw exception 
     } 
} 

и я использую этот класс таким образом:

MyFunction() 
{ 
    myclass mc; 
    mc.do(); 
} 

Мой вопрос:

Если является исключением в do-функции, что произойдет? Является деструктором myclass?

Если нет, то каков наилучший способ справиться с такими ситуациями? Предположим, что у меня нет исходного кода, и я уверен, что происходит в деструкторе.

+7

C++ гарантирует, что деструктор будет вызван, поэтому вам не придется беспокоиться. –

+1

http://stackoverflow.com/questions/8311457/are-destructors-called-after-a-throw-in-c –

+0

Хороший вопрос. Уже ответил. – Sebastian

ответ

5

Если в do do есть исключение, что произойдет?

Если у вас есть обработчик, он будет обработан.

Является ли деструктором класса myclass?

Да, определенно. Стандартные цитаты это ::

Объект любой продолжительности хранения которого инициализация или уничтожение прекращается исключением будет деструкторы выполняться для всех его полностью построенных подобъектов (за исключением членов варианта союзного подобный класс), то есть для подобъектов, для которых завершил выполнение основной конструктор (12.6.2), и деструктор имеет , еще не начатое выполнение. Аналогично, если конструктор не делегирования для объекта завершил выполнение, а конструктор делегирования для , что объект выходит с исключением, деструктор объекта будет вызван . Если объект был выделен в новом выражении, соответствующая функция освобождения (3.7.4.2, 5.3.4, 12.5), если таковая имеется, вызывается в , освобождает место хранения, занимаемое объектом.

Весь этот процесс известен как «стек разматывания»:

Процесс вызова деструкторов для автоматического объекты, построенные на пути из попробовать блок на вбрасывание выражение называется «стек раскручивание ". Если деструктор, вызванный во время разматывания стека, выдает исключение с , вызывается std :: terminate (15.5.1).

11 15.5.1 С ++ :: ЗППП прекращается() функция [except.terminate]

2 ... В ситуации, когда не найдено ни одного обработчика соответствия, оно определяется реализацией или нет стек разматывается до Вызывается std :: terminate().

3

Если исключение поймали где-то, то стек разматывания гарантирует, что деструктор для этого объекта (и, в общем, все автоматические переменные, которые выходят за рамки в результате исключения).Это очень важная гарантия, без которой мы не могли бы использовать такие методы, как RAII, чтобы написать безопасный код.

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

Если программа завершена каким-либо другим способом, например. позвонив по номеру exit() или terminate() или получив необработанный сигнал, тогда стек не будет размотан. Если вам нужны чистые разрушения в этих ситуациях, тогда все будет беспорядочно.

0

В C++ нет явных «окончательных» предложений, подобных многим другим языкам, но вместо этого вы полагаетесь на «RAII», который по существу является методом использования скользящих «автоматических» переменных и опирается на то, что их деструктор будет вызван в соответствующий момент, когда они выходят за рамки.

В вашем случае будет вызываться деструктор myclass, даже если mc.do() выдает исключение. Во многих этих проблемах с закрытием объект, который вы помещаете в верхнюю часть блока области видимости, является классом, который используется только для вызова деструктора при завершении.

Язык «D» поставляется со специальным синтаксисом закрытия. Были попытки написать библиотеки, которые делают это на C++, и с lambdas, конечно, легче писать, чем сейчас, чем раньше, хотя я не думаю, что они являются официальной частью C++.

Смежные вопросы