Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Поведения try…catch при выделении памяти

#cpp


Я правильно понял, что если я запишу:
try {
   char * str = new char[30];
   throw "exception";
   delete [] str;
} catch(...) {
   //здесь ничего не будем делать
}

то произойдет утечка памяти? А если запишу без delete, то утечки памяти не будет?
Также меня интересует, что если исключения произойдет по условию, то как быть с удалением,
или же память удалит С++ сам?
Если я не буду возбуждать исключения, то НЕ будет утечки? Например:
try {
    char * str = new char[30];
    //кое-что делаем, но исключения не возбуждаем.
    delete [] str;
} catch(...) {
    //ничего не делам
}

И в каких случаях память нужно удалять память в catch?    


Ответы

Ответ 1



char *str = nullptr; try { str = new char[30]; throw "exception"; delete [] str; } catch(...) { delete [] str; } По Стандарту, применение оператора delete к указателю на уже очищенную память игнорируется. В C++ блока finally нет, потому можно сделать так. Или обернуть строку умным указателем, который в деструкторе автоматически дернет delete. ЗЫ Но вообще, советуют правильно, если это С++, то нужно по возможности пользоваться классами стандартной библиотеки в общем и std::string в частности.

Комментариев нет:

Отправить комментарий