бросать исключения объектов в стек, утечка памяти с новым? - PullRequest
2 голосов
/ 25 июня 2009

Это ошибка для этого:

if(some_error)
  throw Cat("Minoo");

Где Cat - это класс.

Затем в какой-то другой функции, которая вызвала метод, выдавший исключение ...

Я бы имел:

catch(const Cat &c)
{ 
}

Если он недействителен, могу ли я использовать новый Cat ("Minoo");

Это может вызвать утечку памяти?

Ответы [ 3 ]

6 голосов
/ 25 июня 2009

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

У метательных указателей есть волосатые проблемы, такие как «кто его удаляет?».

Подробнее здесь .

6 голосов
/ 25 июня 2009

1) Неверно? Нет, это именно то, что вы должны сделать: бросить объект. Объект в инструкции throw может находиться в стеке, но он копируется, когда он выбрасывается. Сравните, например, эффект выполнения return Cat ("Minoo");

2) При попадании указателя будет вызвана утечка указанного объекта? Да, если объект был размещен в куче, и если вы не решите удалить его. Но вы должны избегать бросать указатели, как правило.

5 голосов
/ 25 июня 2009

То, что вы написали, совершенно правильно и обычно предпочтительнее, чем выделение объектов исключений в куче.

Если бы вы использовали new, вы, конечно, получили бы утечку памяти, если бы вы не удалили объект в обработчике исключений, который перехватил исключение.

Этот вопрос в C ++ faq (и два последующих вопроса) посвящен этому.

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