Всем привет.
Пишу проект на VS2002,MFC, View/Doc. Проект большой. При выходе из программы появляются сообщения об утечках памяти, причём много. Прочитал статью на этом сайте про нахождение утечек, сделал так:
+ в конструктор и деструктор вставил функции, которые упоминаются в статье. Однако сообщения об утечках остались неинформативными. В чём может быть дело?
Здравствуйте, Trapper, Вы писали:
T>Всем привет. T>Пишу проект на VS2002,MFC, View/Doc. Проект большой. При выходе из программы появляются сообщения об утечках памяти, причём много. Прочитал статью на этом сайте про нахождение утечек, сделал так:
T>В файл CMainFrame.cpp вставил T>
T>+ в конструктор и деструктор вставил функции, которые упоминаются в статье. Однако сообщения об утечках остались неинформативными. В чём может быть дело?
Значит так..
Как уже было сказано, проект использует 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).
Удачи!