Это утечка памяти? Как это должно быть сделано? - PullRequest
2 голосов
/ 24 января 2010

У меня есть что-то вроде этого:

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 24 января 2010

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

throw CustomException(errorMessage);

и поймать, используя константные ссылки:

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

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

7 голосов
/ 24 января 2010

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

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

0 голосов
/ 24 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...