Войти
ПрограммированиеФорумОбщее

Memory leak

Страницы: 1 2 Следующая »
#0
21:52, 3 дек. 2006

Суть проблемы, как следует из названия темы, - утечка памяти. Но с такой хитрой утечкой я еще никогда не встречался. Мой диагноз - или утечка в stl (маловероятно) или порча памяти (тоже маловероятно - см. код).

Собственно утечек несколько, но возникают они в любом из перечисленных ниже кусков кода:

void FileSystem::find(const String& path, const String& pattern, FileInfoList& files) // String == std::string
{
//....
    String path_=path+"\\"; // тут - в operator+
//....

    String search_path=path_+pattern; // тут operator+
}

void FileSystem::pushPath() const
{
  char temp_path[MAX_PATH];

  char* res=_getcwd(temp_path, MAX_PATH);
  std::string str(res);

  temp_stack.push_back(str); // тут в конструкторе копирования string

  _chdir(source.c_str());
}

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

Прямо какая-то полная ж. В ошибки в stl не верю вот уже года два. Сталкивался ли кто-нибудь с подобным?

PS. DevPartner качаю.


#1
22:15, 3 дек. 2006

Ghost2
1. Ты проверил, что _getcwd() не аллокирует память самостоятельно если длина пути > MAX_PATH? Там В MSDN как-то невнятно написано про внутреннюю аллокацию.
2. В какой-то из реализаций std::string действительно есть утечки памяти. Сейчас уже не помню, но несколько лет назад натыкался на такую хрень, на форуме микрософта это обсуждалось.

#2
0:35, 4 дек. 2006

dDIMA

1. Проверял что res==temp_path. Путь там точно меньше 260 символов.
2. Слышал, но это на старых (4-6) версиях студии - баг у dinkumware. Портами не пользуюсь.

Помимо того что номера блоков всегда разные (и как вообще такое возможно?), еще смущает то, что размер некоторых из них доходит до 1.5 кБ, а таких строк я точно не создаю.

#3
0:45, 4 дек. 2006

Ghost2
Плавающие номера блоков могут быть связаны с какими-то time-depends процессами. Например, сбивать статистику очень любит lua, если ее блоки выделяются в общем хипе. Я так понимаю, ошибка возникает именно в FileSystem. Можно ли попробовать ее локализовать внутри маленького теста, чтобы попытаться снять недерминированность?

#4
9:06, 4 дек. 2006

Ghost2
1) Не удаляется объект класса FileSystem.
2) Деструктор FileSystem не вызывается. Так может быть если деструктор базового класса не виртуальный.

#5
11:13, 4 дек. 2006

А может все гораздо проще?
У меня недавно тоже похожие проблемы с STL были. Целый день маялся, а потом оказалось, что не обновлялся Procompilled Header. Сделал Rebuild All и все заработало :-)

#6
12:51, 4 дек. 2006

GvozdodeR

2 - в точку, спасибо большое. После очередного изменения отделил работу с файловой системой и архивами (класс FileStorage) от ресурсов. В предыдущей версии деструктора вообще не было - класс был абстрактным и наследовался от класса Resource с виртуальным деструктором. В новой версии я класс FileStorage и FileSystem вообще не изменял, откуда и вышел этот баг. Еще нашел с десяток неинициализированных пременных.

#7
12:53, 4 дек. 2006

Меня смутило то, что точно такие ошибки были не только в FileSystem, но и в совершенно не связанных с ним классах. Например ошибка возникала при парсинге XML файла (естественно никак не cвязанного c FileSystem) в строчке

int XMLAttributes::getValueAsInteger(const String& attrName, int default_value) const
{
  AttributeMap::const_iterator pos=attrs.find(attrName);

  if(pos==attrs.end())
    return default_value;

  const String& val=(*pos).second;

  std::stringstream sstream(value);// вот тут

  ///...
}

#8
12:57, 4 дек. 2006

Что удивительно - я не добавил в код ни одного delete'a :)

#9
15:01, 4 дек. 2006

Ghost2
Есть такой клевый варнинг в Visual C++: C4265 'class' : class has virtual functions, but destructor is not virtual. Он почему-то по дефолту выключен. Твой случай мог быть диагностирован на этапе компиляции.

Прошло более 1 года
#10
9:04, 11 сен. 2008

Ещё не поздно встретить Новый Год в Эстонии :)

#11
9:55, 11 сен. 2008

Nikopol
да ладна! всего-то 2 года =))))

#12
19:28, 11 сен. 2008

Lolmen

>Плохой стиль : "\\" надо '\\'
LOL. Чем плох этот "стиль"?

Прошло более 10 месяцев
#13
21:30, 23 июля 2009

Ghost2
тем, что в первом случае у тебя строковый литерал со всеми вытекающими, а во втором - char.

#14
21:42, 23 июля 2009

молодой Ghost2 такой молодой..

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.