Как правильно ловить memory leak'и?
От: Trapper  
Дата: 16.01.04 20:32
Оценка:
Всем привет.
Пишу проект на VS2002,MFC, View/Doc. Проект большой. При выходе из программы появляются сообщения об утечках памяти, причём много. Прочитал статью на этом сайте про нахождение утечек, сделал так:

В файл CMainFrame.cpp вставил
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>


+ в конструктор и деструктор вставил функции, которые упоминаются в статье. Однако сообщения об утечках остались неинформативными. В чём может быть дело?
Trapper
Re: Как правильно ловить memory leak'и?
От: Markoff  
Дата: 16.01.04 21:15
Оценка:
Здравствуйте, Trapper, Вы писали:

T>Всем привет.

T>Пишу проект на VS2002,MFC, View/Doc. Проект большой. При выходе из программы появляются сообщения об утечках памяти, причём много. Прочитал статью на этом сайте про нахождение утечек, сделал так:

T>В файл CMainFrame.cpp вставил

T>
T>#define _CRTDBG_MAP_ALLOC
T>#include <stdlib.h>
T>#include <crtdbg.h>
T>


T>+ в конструктор и деструктор вставил функции, которые упоминаются в статье. Однако сообщения об утечках остались неинформативными. В чём может быть дело?
Re[2]: Как правильно ловить memory leak'и?
От: Trapper  
Дата: 16.01.04 21:19
Оценка:
Можно чуть подробнее?
Trapper
Re[3]: Как правильно ловить memory leak'и?
От: Markoff  
Дата: 16.01.04 22:02
Оценка:
Значит так..
Как уже было сказано, проект использует document/view.
Приведу пример:
Во-первых, в программе все указатели должны быть объявлены глобально, т.е. в рамках класса, а не функции. Это потому, что они будут удалены в другой функции.
Например, в вашем файле документа (производного от CDocument) есть переменная, скажем, int* m_pMy. В какой-либо вашей функции вы выделяете ей память (например, m_pMy = new int).
Затем вы работаете с программой через отладчик (F5). Особенно произведите те действия, которые повлекут за собой вызов данной функции (например, если она обработчик события, то нажмите соответствующую кнопку на тулбаре либо в меню либо еще как...).
Далее закрываете программу, и, если не открыто окно отладчика, нажимаете "Alt+2". Перед вам будет окно в котором много чего написано, а конкретно, что делала данная программа. Переходите в конец всего этого и там вы увидите строки примерно след. содержания (конечно, они будут, если в проге действительно есть утечки памяти, как описано выше):
<
...
Detected memory leaks!
Dumping objects ->
E:\My Projects\Temp\TempDoc.cpp(543) : {90} normal block at 0x008D0030, 4 bytes long.
...
>
Это значит, что в файле TempDoc.cpp в строке 543 вызван оператор new, для кот. не вызван delete. Переходим туда и видим:
m_pMy = new int;
Все! Теперь в любой функции, вызывающейся при окончании работы с объектом (для документа, например, может использоваться перегружаемая CDocument::DeleteContents) следует вызвать
delete(m_pMy).
Удачи!
Re[4]: Как правильно ловить memory leak'и?
От: Trapper  
Дата: 17.01.04 09:24
Оценка:
Большое спасибо, Markoff, всё заработало!
Trapper
Re[5]: Как правильно ловить memory leak'и?
От: Markoff  
Дата: 17.01.04 13:06
Оценка:
да не за что — обращайтесь...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.