Утечка памяти
От: Pupil  
Дата: 20.06.05 10:16
Оценка:
Здравствуйте все!
Точно не знаю в какой форум писать, надеюсь модераторы перенесут, если не правильно.

Есть простой MFC SDI-проект, и такой обработчик
void CMainFrame::OnClose() 
{
   vector<string> vec; 

   CMessage pMessage;
   pMessage.AddField("02");

   bool b= (("01"== pMessage.GetField(0)) && ("_"== pMessage.GetField(0)));

   CFrameWnd::OnClose();
}

где:
class CMessage
{  
public:
   void AddField(string strValue)
   {
      m_vecFields.push_back(strValue);
   };
   
   string GetField(int i)
   {
      return m_vecFields[i];
   };
   
private:
   vector<string>   m_vecFields;
};

После запуска по F5 (VC6.0 EE) получаем:
Detected memory leaks!
Dumping objects ->
{217} normal block at 0x00422DC0, 33 bytes long.
 Data: < 02             > 00 30 32 00 CD CD CD CD CD CD CD CD CD CD CD CD

причём странно, если в OnClose я комментирую сторку
vector<string> vec;

или
bool b= (("01"== pMessage.GetField(0)) && ("_"== pMessage.GetField(0)));

то утечка пропадает, хотя они никак не связаны(я так думаю).

Буду благодарен за любые ответы!

22.06.05 17:22: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Утечка памяти
От: LuciferMoscow Россия  
Дата: 20.06.05 10:22
Оценка:
у тебя не это http://rsdn.ru/article/cpp/stlproblem.xml
Автор(ы): Роман Хациев
Дата: 27.02.2002
Если вы пытались работать с экземплярами классов STL, передавая их в DLL, или получая оттуда, а потом бросили это занятие из-за непонятных ошибок, возникающих в вашей программе, то эта заметка для вас. Даже если видимых проблем в вашей программе нет, то все равно прочитайте эту заметку, чтобы знать что делать, когда они появятся :)
часом?
Re[2]: Утечка памяти
От: Pupil  
Дата: 20.06.05 10:34
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>у тебя не это http://rsdn.ru/article/cpp/stlproblem.xml
Автор(ы): Роман Хациев
Дата: 27.02.2002
Если вы пытались работать с экземплярами классов STL, передавая их в DLL, или получая оттуда, а потом бросили это занятие из-за непонятных ошибок, возникающих в вашей программе, то эта заметка для вас. Даже если видимых проблем в вашей программе нет, то все равно прочитайте эту заметку, чтобы знать что делать, когда они появятся :)
часом?


Спасибо за ответ, dll в проекте нет, (но статью прочитаю более внимательно)
вообще всё сделал мастер, кроме CMessage и кода обработчика.
Re[3]: Утечка памяти
От: slava_529872  
Дата: 21.06.05 14:00
Оценка:
Здравствуйте, Pupil, Вы писали:

P>Здравствуйте, LuciferMoscow, Вы писали:


LM>>у тебя не это http://rsdn.ru/article/cpp/stlproblem.xml
Автор(ы): Роман Хациев
Дата: 27.02.2002
Если вы пытались работать с экземплярами классов STL, передавая их в DLL, или получая оттуда, а потом бросили это занятие из-за непонятных ошибок, возникающих в вашей программе, то эта заметка для вас. Даже если видимых проблем в вашей программе нет, то все равно прочитайте эту заметку, чтобы знать что делать, когда они появятся :)
часом?


P>Спасибо за ответ, dll в проекте нет, (но статью прочитаю более внимательно)

P>вообще всё сделал мастер, кроме CMessage и кода обработчика.

Похоже, что не все вы пишете, дорогой товарищь
В вашем примере всегда b == false, а vec нигде не используются. И именно они влияют на утечку ?! Приводите полный код.... посмотрим...а так не верю
Re[4]: Утечка памяти
От: Pupil  
Дата: 21.06.05 14:44
Оценка:
_>Похоже, что не все вы пишете, дорогой товарищь

Пишу всё

_>В вашем примере всегда b == false, а vec нигде не используются. И именно они влияют на утечку ?!


да так и было, поэтому и пишу.
А проблема решилась устанокой Vs6sp6.
Re: Утечка памяти
От: Аноним  
Дата: 22.06.05 19:35
Оценка:
здрасте

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

но если я и ошибаюсь (уже довольно поздно или чегото недоглядел), то уменя есть метод неплохо выцыпляющий такие грабли.

1. нужно поставить бряки в наиболее интересующих частях (там где происходит инициализация перем.-х)
2. запустицца в отладку (ф5)
3. добавить дебуггеру окно memory и установить в этом окне адрес покоторому течет.
4. далее все еще проще... скачем по бррякам и палим в memory.
как только оно засветицца красным то станет уже и жирафу понятно какая перем.-ая течет.

можт и не оригинально, зато эффективно. надеюсь с дебагом все на "ты" ? ))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.