![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Сабж.
Доброго времени суток! Банальный вопрос. Но все же... Как избежать утечек памяти в большом проекте? Что для этого стОит делать, а чего не стОит? Может все объекты "собственного" производства унаследовать от базового, который в себе переопределит operator new, operator delete, и в нем вести учет выделенной/освобожденной памяти. От утечек это конечно не избавит, но хотя бы можно будет обнаружить это на ранней стадии разработки. В общем вопрос понятен. Это сообщение отредактировал(а) andrew_121 - 25.5.2009, 01:25 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
REZiaMIX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Как то делал проект, средний по объему.
Никак не мог уловить утечку памяти(видно было по диспетчеру задач). За 10 секунд в проект была вставлена брутальность в виде:
еще 3 минуты , и утечка была найдена ![]() В Borland C++ Builder есть хорошая штука - CodeGuard. Сообщает не только об утечках , но и о других ошибках. Уверен на все %сто% , что и для других более-менее популярных сред есть аналогичные инструменты! Еще вспомнилось , в вижуал студии есть встроенная поддержка для контроля утечек памяти. Надо прописать какие то дефайны. Это сообщение отредактировал(а) REZiaMIX - 25.5.2009, 01:17 -------------------- ![]() |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
REZiaMIX, C getmem() - Согласен. А с freemem() - Нет!
ГетМем() правильно щитает выделенную память, а ФриМем - нет! Он щитает только размер указателя. Какая польза ??? Даже если указатель разименовать, он будет щитать размер объекта на который указывает. Что-то тут не то... Да и ваще, мне что в проекте переименовать все operator new, operator delete, и заменить их на методы? Как-то не логично. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
REZiaMIX |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 3.11.2007 Репутация: нет Всего: 4 |
Хм , и в правду , надо порыться в исходниках.
Вот тут чуток для visual c++; Добавлено @ 01:39
Для смысла будет понятно) Добавлено @ 01:40 переименовывать в моем случае ничего не надо , #define все сделает сам ![]() Это сообщение отредактировал(а) REZiaMIX - 25.5.2009, 01:41 -------------------- ![]() |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
REZiaMIX, ну допустим, я воспользуюсь твоим примером. память он выделяет и освобождает. а как быть с конструкторами/деструкторами?
их что, явно вызывать? ![]() в общем не то... -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Воспользоваться или реализовать самому умные указатели.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Да. Спасибо. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
и это тоже..но в основном ответ на вопрос звучит так - писать правильный код ![]() Пример где использование умных указателей не спасет от возможной утечки памяти
|
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
azesmcar, почему не спасет? запятая ж является точкой следования
andrew_121, переопределять глобальные operator new, operator delete, operator new[], operator delete[] если в приложении критична скорость, переопределять их с помощью #ifdef ну и есть куча тулзей, что тебе лики предоставит Это сообщение отредактировал(а) Alek86 - 25.5.2009, 09:09 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
при возникновении исключения в одном из конструкторов - может случится утечка. Например если очередь подстановки параметров функции (которая кстати неопределена по стандарту - а это значит что компилятор волен делать это как его компиляторской душе угодно) будет происходить так
если на втором шаге произойдет исключение - будет утечка. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
умные указатели - не панацея если возможны циклические ссылки, то shared_ptr не поможет придется добавлять weak_ptr и серьезно проектировать, ибо вики хорошо так добавляют в сложности проги Добавлено через 2 минуты и 29 секунд тьфу, это ж обьява функции кто ж так пишет обьявы, что не заметишь.... |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ага, имхо, намного
совсем не так прочел - слишком стиль от привычного мне отличается ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
sparn |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 11.5.2006 Репутация: нет Всего: 1 |
есть несколько простых правил, придерживаясь которых можно избежать большинства возможных утечек, например: избегать по максимуму ручного выделения и удаления памяти (например использовать контейнеры которые подчистят сами при удалении), удалять память там где выделяешь, написал new напиши сразу delete... Исходя из собственного опыта про умные указатели могу сказать что они не исключают утечек и если уж таковые произошли то процесс выявления и избавиления от них может стать настоящим кошмаром >_<.
для проверки и выявления тяжелых случаев утечек я использовал memory validator. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |