Исключение внутри функции, возвращающей значение для конструктора - PullRequest
2 голосов
/ 25 июля 2010

Допустим, у меня есть класс, который действует как «умный указатель» и освобождает некоторый системный ресурс при уничтожении.

class Resource{
protected:
     ResourceHandle h;
public:
     Resource(ResourceHandle handle)
     :h(handle){
     }

     ~Resource(){
         if (h)
             releaseResourceHandle(h);//external function, probably from OS
     }
};

И у меня есть некоторая функция, которая возвращает значение, используемое для инициализации «Ресурса»:

ResourceHandle allocateHandle();

Теперь, если я сделаю это в своем коде:

Resource resource(allocateHandle());

И allocateHandle () выдает исключение , что именно произойдет?Произойдет ли сбой во время создания Resource () или перед созданием?

Здравый смысл подсказывает мне, что поскольку исключение выдается до возврата allocateHandle, выполнение даже не войдет в конструктор Resource (), но я не совсем уверен в этом.Это правильное предположение?

Ответы [ 5 ]

4 голосов
/ 25 июля 2010

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

3 голосов
/ 25 июля 2010

Да, вы правы (как все говорили).

Но на что вы намекаете (я думаю).
Что происходит с объектом, если был введен конструктор и сгенерировано исключение.

Будет ли деструктор все еще выполняться или нет?

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

Что произойдет, если во время выполнения конструктора возникнет исключение.
В этом случае, потому чтоконструктор не был завершен, деструктор также никогда не будет выполнен, но как насчет всех полей-членов?Если конструктор оставлен через исключение, то для всех полностью сформированных членов будут называться деструкторы (полностью сформированный элемент - это член, конструктор которого был успешно вызван и завершен).

1 голос
/ 25 июля 2010

Если компилятор вошел в конструктор, какое значение он мог бы передать из функции, которая не возвращала?

1 голос
/ 25 июля 2010

Это правильное предположение.

0 голосов
/ 25 июля 2010

Да, ваше предположение верно.

На данный момент вы только создаете свои параметры и помещаете их в стек.Объект «Ресурс» даже не сформирован!

Поэтому исключение не вызовет деструктор во время разматывания стека.

...