Страницы

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

среда, 20 марта 2019 г.

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

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


Ответ

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

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

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