Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++]Утечка памяти  (Прочитано 15093 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 21-08-2009 16:07 » 

Привет, есть ли какие-нибудь способы узнать, забываю ли я где-нибудь освобождать память?

Т.е. должно же быть так: сколько было свободной оперативки до запуска моей программы, столько же и после выхода из неё?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 21-08-2009 16:17 » 

кто чем пользуется, в студии, к примеру, можно без точек останова запустить на отладку, а по выходу из программы в окне Output будет расписано, где выделялись блоки, которые потеряны (если есть такие, конечно)

Цитата
сколько было свободной оперативки до запуска моей программы, столько же и после выхода из неё

так никогда не бывает, даже если приложение ничего не потеряло Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 21-08-2009 16:22 » 

После окончания работы программы память и так очистится. Утечка страшна тем, что: 1. Свидетельство безалаберного программирования, что само по себе есть очень большой минус 2. В зависимости от количества выделяемой памяти, может привести к зависанию и/или вылета программы и/или системы.

Утечку памяти проще (и полезней) всего проверить вручную - число операторов new должно в точности соответсвовать числу операторов delete. Исключение, когда объекты заносятся в масивы, списки и тп, а удаляются в цикле. В этом случае необходимо проверить, что для каждого созданного объекта вызывается оператор delete. Не забывай, что для массивов необходимо указывать, что удаляется именно массив - delete [] pMyArray;

Поиск утечек в уже существующей программе можно существенно упростить. Для этого есть ряд специальных отладочных ф-ций. Тут всё зависит от среды разработки. Под VS C++ в режиме отладки достаточно в .cpp файлах переопределить оператор new след. образом:

Код:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

Это необходимо для того, чтобы
по выходу из программы в окне Output будет расписано, где выделялись блоки, которые потеряны (если есть такие, конечно)
« Последнее редактирование: 21-08-2009 16:24 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 21-08-2009 16:28 » 

Алексей1153++ и Джон, спасибо - все понял:)

Я внимательно всегда слежу за такими вещами, просто насторожило вот что:
Я использую готовую библиотеку 2d графики, там есть функция, которая пишет в лог-файл сколько оперативной памяти свободно каждый раз перед запуском программы. И каждый раз при новом запуске её становится все меньше примерно на 5-6 мб.

Т.е., это ничего страшного?
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 21-08-2009 16:34 » 

Запуск в режиме debug, в окне вывода кроме информации о загрузки разный библотек, есть эта:
Цитата
The thread 0x518 has exited with code 0 (0x0).
The thread 0xDE0 has exited with code 0 (0x0).
The thread 0xAE0 has exited with code 0 (0x0).
The thread 0x7DC has exited with code 0 (0x0).
The thread 0x9D4 has exited with code 0 (0x0).
The thread 0xECC has exited with code 0 (0x0).
The thread 0x328 has exited with code 0 (0x0).

Что это значит:)? Вроде все в порядке и утечек нет?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 21-08-2009 16:35 » 

про утечки нет записей.
Это всё расписаны коды окончания потоков программы

но ты мог и не совершить действия с утечкой Ага Поэтому надо доверять своему коду. Но проверять Отлично
Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 21-08-2009 16:37 » 

Джон, сорри, не увидел исправление.

Блин, а в старенькой студии (VC++ 6.0), не работает,
пишет
operator DEBUG_NEW' is not a recognized operator or type

Завтра в новой соберу.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 21-08-2009 16:46 » 

В старенькой шестёрке кажется этот макрос автоматически генерился в стандартных классах (в .сpp) файлах.

Код:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

Да! Самое главное afx.h должен быть подключен.
« Последнее редактирование: 21-08-2009 16:47 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 21-08-2009 16:47 » 

что значит - в старенькой ? )) Я всё ещё успешно там пишу (сел вот недавно 9 осваивать)
а по поводу

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

надо соблюдать одно правило: в cpp-файле стараться не ставить инклуды заголовков после этих строк. То есть только до

А также, если в хедерах есть работа с new и delete - то их студия учесть не сможет по понятным причинам Улыбаюсь

Цитата
Я использую готовую библиотеку 2d графики, там есть функция, которая пишет в лог-файл сколько оперативной памяти свободно каждый раз перед запуском программы. И каждый раз при новом запуске её становится все меньше примерно на 5-6 мб.
если каждый раз - то это нехорошо
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 21-08-2009 16:51 » 

Т.е., это ничего страшного?

Нет, это нормально. Главное, чтобы в процессе работы без вливания дополнительных данных эта память не увеличивалась. Тут уже надо смотреть объективно. Если прога открывает БД, то ессно ей нужно больше памяти. А вот если она отрисовывает одну картинку и при каждом апдейте окна память увеличивается, однозначно утечка. Кстати не только памяти, но и ресурсов. Неиспользуемые и временые GDI объекты надо освобождать.

Кстати, а библиотека случайно не на gdi+?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 21-08-2009 21:42 » 

если в хедерах есть работа с new и delete - то их студия учесть не сможет по понятным причинам Улыбаюсь
В основном вся работа у меня в хидерах, а cpp только один.

И как тогда поступить - макрос
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
записать перед своими хидерами?
Кстати, а библиотека случайно не на gdi+?
Нет, HGE:)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 21-08-2009 21:50 » 

разделить код по файлам h и cpp (по крайней мере, в cpp вынести работу с new и delete)
Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 21-08-2009 22:03 » 

Алексей1153++,  будет очень много работы.
У меня куча классов, описанных в хидерах, которые во время своей работы, а также в конструкторах-деструкторах загружают ресурсы, выделяют память и освобождают соответсвенно.

А что насчёт devpartner studio?
Слышал только, что с её помощью можно как-то все это проконтролировать.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 21-08-2009 22:13 » 

1) значит, твои классы написаны неудобно и их всё равно надо переписать Улыбаюсь
2) с сложного ничего нету. Ведь не всё нужно переносить. Оставляешь в хедере прототип функции, а в cpp - описываешь функцию
Записан

The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 21-08-2009 22:24 » 

Попробую:)
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 21-08-2009 22:30 » 

А вообще, я все по колхозному все дело организовал, просто по не знанию.
Студией учился все делать только методом тыка.
А книжках по С++ не слова не пишут о том, как оргагизовывать .h и .cpp файлы.

Что по этой теме почитать? Вообще по студии встречал только книжки, в которых больше по MFC идут уроки, а он мне не нужен. Как поступить? 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 21-08-2009 22:41 » 

при чём тут студия и MFC ?

читай про язык C++ . Книжки не помню ( Полазий по нашей библиотеке (заходи с shelek.ru)
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 21-08-2009 22:47 » 

В MSDN есть куча примеров на почти все случаи жизни. Посмотри как там код организован.

Если не хочешь себе жизнь усложнять, то:

1. В .h только объявляй (декларируй), а имплементируй в .срр
2. Делай по одной паре h-cpp на класс, особенно если классы большие. Конечно, если например основная работа это класс-список, который пользуется классом данных с парочкой полей, то можно всё делать в одной паре. Но лучше не надо. Да, я знаю получится куча файлов, но в студийном эксплорере можно делать папки, пользуйся этим.
3. Если есть необходимость вставлять кучу одних и тех же заголовочных файлов в кучу срр, то лучше вставить их в один .h файл, а его уже инклудить в .срр. Типа stdafx.h.

Кстати, а библиотека случайно не на gdi+?
Нет, HGE:)

Я не про используемую тобой библиотеку, а о том на чём она работает. Винда предлагает два интерфейса GDI и gdi+, и хотя последний является лишь надстройкой над первым, они принципиально различаются. Так вот gdi+ очень не любит этих макросов, если это твой случай, то тебе необходим специально подготовленый заголовочный файл. Иначе кроме ругани на макрос ты ничего не получишь.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 21-08-2009 22:57 » 

3. Если есть необходимость вставлять кучу одних и тех же заголовочных файлов в кучу срр, то лучше вставить их в один .h файл, а его уже инклудить в .срр. Типа stdafx.h.

Ну хоть с этим я угадал - так и поступаю)

Я не про используемую тобой библиотеку, а о том на чём она работает. Винда предлагает два интерфейса GDI и gdi+

HGE - это надстройка над DirectX 8 и WinApi. Причем из последней взято только создания окна.
Улыбаюсь
 
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines