2010-01-24 3 views
2

У меня есть что-то вроде этого:Это утечка памяти? Как это сделать?

void Test(void) 
{ 
    char errorMessage[256]; 

    spintf(errorMessage,... blablabla); 
    throw new CustomException(errorMessage); 
} 

Будет ли это утечка памяти, потому что ErrorMessage будет не освобожден? Или это вызовет исключение при доступе к сообщению об исключении внутри try {} catch, потому что errorMessage был освобожден при выходе из функции?

Заранее спасибо.

+2

Каково определение конструктора CustomException? Ответ на ваш вопрос зависит от того, скопирована ли строка errorMessage или нет. – mcdave

+0

Ошибка строки не была скопирована –

ответ

7

Память errorMessage уже будет освобождена при обращении с помощью обработчика улова. Однако вы можете просто скопировать его в std::string в конструктор CustomException.

С другой стороны, утечка памяти может быть вызвана самим исключением, поскольку вы положили его в кучу. Это необязательно.

0

Это не вызовет утечку памяти, но это может привести к неопределенному поведению в зависимости от того, что вы делаете с этим исключением. Я полагаю, утечки памяти могут произойти только при распределении динамической памяти

7

Ответ да, очень вероятно. Вы никогда не должны бросать объекты, созданные с помощью new. Вместо этого бросьте значение:

throw CustomException(errorMessage); 

и поймать с помощью константных ссылок:

try { 
    ... 
} 
catch(const CustomException & e) { 
    ... 
} 

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

+0

Согласовано. Бросай значения, поймайте ссылки, и все будет в порядке. Указатели бросания подвержены ошибкам, так как вам нужно соглашение о том, кто должен их освобождать, и который вводит кромки, например. что произойдет, если кто-то захочет повторно бросить пойманное исключение? – MarkR

+0

Я мертв против ловли ссылкой на const. Вы должны улавливать 'reference', но не обязательно' const', так как вы можете изменить исключение (добавить уточнения), а затем повторно выбросить. –

+0

@Matthieu Ну, вы, вероятно, в небольшом меньшинстве. Большинство людей не хотят изменять исключение, поэтому использование const имеет смысл. – 2010-01-24 13:17:04

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