![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
освободится ли память в такой конструкции, если между new и delete произошло исключение и управление попало в catch?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
нет, если будет брошено исключение, управление не дойдет до delete а сразу перейдет к блоку catch. более того, если быть педантичным
не гарантирует безопасность исключений. В С++ оператор new может генерировать исключения. Если использовать
тогда оператор new вернет NULL. Но это так ![]()
пиши так (если не собираешся делать rethrow в блоке catch или
хотя такие исключения как bad_alloc лучше перехватывать во входной точке. Это сообщение отредактировал(а) azesmcar - 16.3.2009, 08:39 |
||||||||||
|
|||||||||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
azesmcar, спасибо за ответ.
Т.к. у меня rethrow в блоке catch. Я сделал так:
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
лишняя проверка. инициализируй
и удаляй спокойно, в С++ удаление нулевых указателей - вполне нормально
|
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
azesmcar, какой плохой совет
![]() во первых, не стоит использовать catch(...) без catch(const std::exception&) так как теряется контекст в котором произошла ошибка во второых, лучше использовать идиому RAII, например использовать смарт поинтер
|
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
во первых catch(...) писал не я, и я не думал что тут имеется ввиду перехват всех исключений. Человек чтобы не писать все, просто написал три точки. во вторых
есть множество решений. А бы не стал использовать смарт поинтер, так как - стандартно такого смарт поинтера в С++ нет, а писать его для того чтобы не писать один лишний delete я бы тоже не стал. Добавлено через 1 минуту и 37 секунд и причем тут буст??? мы говорим о С++? в С++ нет такого класса как
Добавлено через 3 минуты и 30 секунд а вообще catch(...) не хорошо. Это можно поставить как дополнительную проверку во входной точке после catch (std::exception& e) |
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
scoped_ptr в TR1 к тому-же, писать delete вручную можно, но это приводит к туче boilerplate кода |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
нет такого класса. ![]() Добавлено через 2 минуты и 12 секунд
зависит от того сколько раз придется это писать...конкретно в примере недостаточно информации чтобы посоветовать использовать smart pointer (по моему) |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
действительно нет, зато есть в TR2 и в boost, в общем это не оправдание)
|
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Я ищу и исправляю места, где могли бы быть утечки, в большом проекте, написанном не мной. Так что переписывать на smart pointer'ы я не буду. Ограничусь тем, что здесь написал и добавлением логгирования в catch(..)
там действительно троеточие! -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
кому??? с чего ты взял что я оправдываюсь и вообще мне это надо? и перед кем? У меня дома тоже полно классов написано...давайте о них поговорим. Если речь идет о С++ - тогда решаем проблему средствами С++, меня лично не устроил бы ответ "скачай буст и используй там один класс". Я не собираюсь качать буст ради одного класса который я буду использовать один раз в своей программе. Я согласен что как вариант ты мог предложить смарт поинтер, но это никак не влияет мой ответ. Лично я сделал бы так, еслиб использоват больше одного раза, написал бы свой смарт поинтер. Но контекст задачи мне не известен Добавлено через 1 минуту и 26 секунд
Bounds Checker пробовал? |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а чем std::auto_ptr для текущего примера тс не подходит ?
|
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
auto_ptr использует оператор delete а не delete []
|
||||
|
|||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
по твоему писать
есть хорошо? намного чище на мой взгляд
ну а если у тебя в ф-ии создаются динамчески несколько объектов? boost smart_ptr - header only библиотека, и ничего за собой не тянет, к тому-же я не думаю что ты сможешь написать свой смарт поинтер, аналогичный по реализации boost::shared_ptr =)
спокойно, дышим глубже )) |
||||||
|
|||||||
azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
речь не о том - хорошо это или плохо. а о том что вопрос не был
а о том что вопрос был
я лишь отвечал как сделать так чтобы не было утечки памяти, никто не спрашивал хорошо ли писать catch(...).
я не спорю что это так. Но, к коду добавляется дополнительный файл, в итоге мы получаем где-то 50 строк в отдельном файле, и избавляемся от 3х строк в одном. Мне кажется что смысл использования смарт поинтера в данной задаче определяется множеством факторов о которых нам не известно, поэтому сказать однозначно - которое решение лучше я не могу. Я предложил одно, ты предлагай другое..а уж тот кому виден весь код решит которое из них для него более приемлемо.
я спокоен как слон. Просто не люблю слова оправдания - я никогда и ни перед кем не оправдывался и не собираюсь этого делать, если я не прав - извинюсь, если меня неверно поняли - обясню еще раз..но не буду оправдыватся.. |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |