| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > освободится ли память? |
| Автор: ksili 16.3.2009, 08:23 | ||
освободится ли память в такой конструкции, если между new и delete произошло исключение и управление попало в catch?
|
| Автор: azesmcar 16.3.2009, 08:30 | ||||||||||
нет, если будет брошено исключение, управление не дойдет до delete а сразу перейдет к блоку catch. более того, если быть педантичным
не гарантирует безопасность исключений. В С++ оператор new может генерировать исключения. Если использовать
тогда оператор new вернет NULL. Но это так
пиши так (если не собираешся делать rethrow в блоке catch или
хотя такие исключения как bad_alloc лучше перехватывать во входной точке. |
| Автор: ksili 16.3.2009, 09:06 | ||
| azesmcar, спасибо за ответ. Т.к. у меня rethrow в блоке catch. Я сделал так:
|
| Автор: azesmcar 16.3.2009, 09:11 | ||||||
лишняя проверка. инициализируй
и удаляй спокойно, в С++ удаление нулевых указателей - вполне нормально
|
| Автор: Lazin 16.3.2009, 09:14 | ||
| azesmcar, какой плохой совет во первых, не стоит использовать catch(...) без catch(const std::exception&) так как теряется контекст в котором произошла ошибка во второых, лучше использовать идиому RAII, например использовать смарт поинтер
|
| Автор: azesmcar 16.3.2009, 09:17 | ||||||
во первых catch(...) писал не я, и я не думал что тут имеется ввиду перехват всех исключений. Человек чтобы не писать все, просто написал три точки. во вторых
есть множество решений. А бы не стал использовать смарт поинтер, так как - стандартно такого смарт поинтера в С++ нет, а писать его для того чтобы не писать один лишний delete я бы тоже не стал. Добавлено через 1 минуту и 37 секунд и причем тут буст??? мы говорим о С++? в С++ нет такого класса как
Добавлено через 3 минуты и 30 секунд а вообще catch(...) не хорошо. Это можно поставить как дополнительную проверку во входной точке после catch (std::exception& e) |
| Автор: azesmcar 16.3.2009, 09:22 | ||||
нет такого класса. Добавлено через 2 минуты и 12 секунд
зависит от того сколько раз придется это писать...конкретно в примере недостаточно информации чтобы посоветовать использовать smart pointer (по моему) |
| Автор: Lazin 16.3.2009, 09:28 |
| действительно нет, зато есть в TR2 и в boost, в общем это не оправдание) |
| Автор: ksili 16.3.2009, 09:34 |
| Я ищу и исправляю места, где могли бы быть утечки, в большом проекте, написанном не мной. Так что переписывать на smart pointer'ы я не буду. Ограничусь тем, что здесь написал и добавлением логгирования в catch(..) там действительно троеточие! |
| Автор: azesmcar 16.3.2009, 09:34 | ||||
кому??? с чего ты взял что я оправдываюсь и вообще мне это надо? и перед кем? У меня дома тоже полно классов написано...давайте о них поговорим. Если речь идет о С++ - тогда решаем проблему средствами С++, меня лично не устроил бы ответ "скачай буст и используй там один класс". Я не собираюсь качать буст ради одного класса который я буду использовать один раз в своей программе. Я согласен что как вариант ты мог предложить смарт поинтер, но это никак не влияет мой ответ. Лично я сделал бы так, еслиб использоват больше одного раза, написал бы свой смарт поинтер. Но контекст задачи мне не известен Добавлено через 1 минуту и 26 секунд
Bounds Checker пробовал? |
| Автор: mes 16.3.2009, 09:42 |
| а чем std::auto_ptr для текущего примера тс не подходит ? |
| Автор: azesmcar 16.3.2009, 09:43 | ||||
auto_ptr использует оператор delete а не delete []
|
| Автор: Lazin 16.3.2009, 09:46 | ||||||||
по твоему писать
есть хорошо? намного чище на мой взгляд
ну а если у тебя в ф-ии создаются динамчески несколько объектов?
boost smart_ptr - header only библиотека, и ничего за собой не тянет, к тому-же я не думаю что ты сможешь написать свой смарт поинтер, аналогичный по реализации boost::shared_ptr =)
спокойно, дышим глубже )) |
| Автор: azesmcar 16.3.2009, 09:56 | ||||||||||
речь не о том - хорошо это или плохо. а о том что вопрос не был
а о том что вопрос был
я лишь отвечал как сделать так чтобы не было утечки памяти, никто не спрашивал хорошо ли писать catch(...).
я не спорю что это так. Но, к коду добавляется дополнительный файл, в итоге мы получаем где-то 50 строк в отдельном файле, и избавляемся от 3х строк в одном. Мне кажется что смысл использования смарт поинтера в данной задаче определяется множеством факторов о которых нам не известно, поэтому сказать однозначно - которое решение лучше я не могу. Я предложил одно, ты предлагай другое..а уж тот кому виден весь код решит которое из них для него более приемлемо.
я спокоен как слон. Просто не люблю слова оправдания - я никогда и ни перед кем не оправдывался и не собираюсь этого делать, если я не прав - извинюсь, если меня неверно поняли - обясню еще раз..но не буду оправдыватся.. |
| Автор: ksili 16.3.2009, 10:03 | ||||
В смысле "хорошо"? мне надо чтобы не было утечки памяти. И желательно чтобы вносить минимум изменений в исходный код. |
| Автор: vinter 16.3.2009, 10:32 |
лучше слушай Lazin'а, изменения со smart pointers, будут минимально. Но ты напишешь чистый код и избавишь потомков(себя?) от проблем в будущем. |
| Автор: maxim1000 16.3.2009, 19:54 |
| а может, банальный std::vector? |
| Автор: Lazin 16.3.2009, 21:16 |
в данном случае это оптимальный вариант |