Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Cmap приводит к утечкам памяти

13K
19 марта 2009 года
zxxc
18 / / 04.05.2006
Есть такой массив:
class CMapStringToATMRecord2 :
public CMap<CString*,CString*,CATMRecord,CATMRecord>
{
private:

public:
CMapStringToATMRecord2(void);
~CMapStringToATMRecord2(void);
};

CMapStringToATMRecord2 atms.
Собственно работаю примерно так:
CString str="разные значения в цикле проставляю"
CATMErrorRecord atmValue;
atms.SetAt(&str,&atmValue); // в этой строке помоему происходит утечка памяти

Я примерно представляю почему, по этому и сделал наследование от Cmap и в деструкторе попытался в ручную удалить все ключи и все значения вот так:

POSITION pos = GetStartPosition();
CString *key=NULL;
while(pos){
//CATMRecord atmValue;
GetNextAssoc(pos,key,atmValue);
//atmValue.~CATMRecord();
delete key;
};
};
Но такой деструктор память все таки не очищает, или очищает только ключи,
а вот если раскоментировать двестроки, то я так понимаю, уничтожение значений ячеек массива идет
Но дальше при выходе из деструктора видимо пытается вызваться настоящий родной деструктор CATMRecord atmValue и программа падает

Вобщем может кто подсказать решение чтобы минимально переделывая программу уже готовую избавиться от утечек памяти в Cmap структурах

з.ы. class CMapStringToShortInt2 : public CMap<CString*,CString*,short int,short int>
{

public:
CMapStringToShortInt2(void);
~CMapStringToShortInt2(void);
};
в таком классе я очищаю освобождаю память вот так:
CMapStringToShortInt2::~CMapStringToShortInt2(void)
{
POSITION pos = GetStartPosition();// освобождаем место от Cmap
CString *key=NULL;
short int val;
while(pos)
GetNextAssoc(pos,key,val),
delete key;
}
240
20 марта 2009 года
aks
2.5K / / 14.07.2006
Да, что то какой то набор жести, а не код.
Вот ответь на два вопроса сначала.
- Зачем ты передаешь ключи по указателю, как ты потом будешь доступаться к данным? Для доступа нужен будет указатель на ту же самую область памяти, а не другой, пусть и содержащий такую же строчку.
- Зачем ты удаляешь в деструкторе память выделенную не внутри объекта. Кто выделял память перед тем как передать указатели в мап, тот и должен позаботится потом об удалении. Но никак не сам контейнер.
13K
20 марта 2009 года
zxxc
18 / / 04.05.2006
http://forum.codenet.ru/showthread.php?t=53874
шаблоны которые позволят разрешить твой первый пункт, перегружается сравнение, и ключ находится который в другом куске памяти, но с такой же строкой
Проблема в том что выделение памяти идет вида:
Cstring *key = new....
map[key]=...
так вот удалить тут key нельзя)
Чтобы удалить нормально я использовал сначала так:
CString *mas[512];
mas = new CString(i);
map[mas] = ....

после использования мапа я удаляю в цикле ключи:
for(i=0;i<n;i++) delete mas
этот метод нормально очищал память когда в качестве знасчений были инты, ради интереса я его заменил перегруженным деструктором в первом посте по pos пробежал и удалил и тоже все ок

а вот когда значения классы такая штука не работает, а почему не работает я толком не понимаю из-за недостатка знаний, толи делит нужно делать ключам и значениям (т.е. два массива держать) то ли, я пробовал по разному но толком не вышло никак
В мсдн сказано что объекты значений сами должны удаляться при выходе за видимость, но вот толи я неправильно их инициализирую, толи не знаю что, вобщем память не очищается
Может попробывать сделать : CMap<CString*,CString*,CATMRecord*,CATMRecord*>?
13K
20 марта 2009 года
zxxc
18 / / 04.05.2006
кстати, по поводу кто выделял и т.п. я когда сделал такой деструктор пришел к такому выделению памяти:
map.SetAt(new CString("asds"),value);
При таком выделении же на эту область кроме как в мапе нигде ключи не храрнятся, разве они не должны освобождать при выходе за область видимости?
240
20 марта 2009 года
aks
2.5K / / 14.07.2006
Цитата: zxxc
http://forum.codenet.ru/showthread.php?t=53874
шаблоны которые позволят разрешить твой первый пункт, перегружается сравнение, и ключ находится который в другом куске памяти


Ну хорошо, добавил ты сравнение по указателям на строку но зачем? Если тебе нужны просто строковые ключи, почему ты хранишь там не сами экземпляры объектов строк, а указатели на них? Темболее что судя по твоей ссылке у них уже реализованно все необходимые сравнения (а если и не реализованны то можно их и добавить) и скорее всего конструктор копирования и оператор присваивания. В чем тайный смысл изобретать костыли, для ханения указателей, если можно использовать сами объекты в качестве ключей?

Цитата: zxxc
кстати, по поводу кто выделял и т.п. я когда сделал такой деструктор пришел к такому выделению памяти:
map.SetAt(new CString("asds"),value);
При таком выделении же на эту область кроме как в мапе нигде ключи не храрнятся, разве они не должны освобождать при выходе за область видимости?


Здесь ты выделяешь память вне объекта, а туда передаешь только указатель. Соотвественно когда эти данные больше не нужны - ты должен взять эти указатели из мапа и удалить их. Откуда мап может знать что там у него храниться и можно ли это вобще удалять в дестукторе - может у тебя эти указатели еще где то используются, не только в мапе.

240
20 марта 2009 года
aks
2.5K / / 14.07.2006
Использовал бы std::map< std::string, твой_тип >, ну или std::wstring. документации полно, портируемо - может меньше недопонимания было бы. )
11
20 марта 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: aks
Использовал бы std::map< std::string, твой_тип >, ну или std::wstring. документации полно, портируемо - может меньше недопонимания было бы. )


гы... http://forum.codenet.ru/showpost.php?p=279126&postcount=5

355
21 марта 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
есть MFC"шная CMapStringToObject (кажется так называется), если не хочется STL пользовать. но я как-то всё-таки заставлял обычный CMap держать CString в качестве ключей. но уже не помню как
13K
23 марта 2009 года
zxxc
18 / / 04.05.2006
Так вот обычный Cmap у меня использует Cstring, но я не знаю как правильно объявлять ему ключи и значения чтобы они корректно освободились из памяти при уничтожении мапа
240
23 марта 2009 года
aks
2.5K / / 14.07.2006
Не понял вопроса. Если там будут храниться сами экземпляры объектов, а не указатели на них то не надо их вручную удалять.
13K
23 марта 2009 года
zxxc
18 / / 04.05.2006
Цитата: aks
Не понял вопроса. Если там будут храниться сами экземпляры объектов, а не указатели на них то не надо их вручную удалять.



Так не удаляются они сами


Переделал под CMapStringToObj
atms->SetAt(atmValue.terminalID.Trim(),(CObject*)new CATMRecord(&atmValue)); // утечка памяти в этом месте

[quote]{
CMapStringToOb map;

CAge age1(13); // Two objects on the stack
CAge age2(36);
map.SetAt(_T("Bart"), &age1);
map.SetAt(_T("Homer"), &age2);
ASSERT(map.GetCount() == 2);
map.RemoveAll(); // CObject pointers removed; objects not removed.
ASSERT(map.GetCount() == 0);
ASSERT(map.IsEmpty());
} // The two CAge objects are deleted when they go out of scope.
[quote]
это из мсдн, вот только реально они при выходе из области видимости почему-то не удаляются

355
25 марта 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
читай книжки по С++. когда поймёшь разницу между обычной переменной, ссылкой и указателем, тогда возвращайся к спискам, map"ам и т.п.
240
26 марта 2009 года
aks
2.5K / / 14.07.2006
Цитата: zxxc
Так не удаляются они сами


Все удалется. В твоем примере ты хранишь не с ами оьбъекты, а указатели на них. Вот эти указатели и удаляются, а память куда они указывали - теряется. Если бы хранил сами экземпляры объектов строк в качестве ключей например, а не указатели - таких проблем бы не было.

13K
02 апреля 2009 года
zxxc
18 / / 04.05.2006
Цитата: aks
Все удалется. В твоем примере ты хранишь не с ами оьбъекты, а указатели на них. Вот эти указатели и удаляются, а память куда они указывали - теряется. Если бы хранил сами экземпляры объектов строк в качестве ключей например, а не указатели - таких проблем бы не было.



так я вручную же вызываю delete для них

Вобщем сделал все аккуратно по тому принципу что описан выше, все стало ок) Всем спасибо.

Еще вопросик: если прога загружает библиотечку динамически, из библиотечки вызывается функция, в функции есть утечка памяти) то при выгрузке этой динамической библиотечки что происходит с той утерянной памятью? Она очищается или как? (прога остается в памяти, а библиотека только выгружается)

51K
18 июля 2009 года
Zavulon85
1 / / 18.07.2009
Цитата: zxxc
Есть такой массив:
class CMapStringToATMRecord2 :
public CMap<CString*,CString*,CATMRecord,CATMRecord>
{
private:

public:
CMapStringToATMRecord2(void);
~CMapStringToATMRecord2(void);
};

CMapStringToATMRecord2 atms.
Собственно работаю примерно так:
CString str="разные значения в цикле проставляю"
CATMErrorRecord atmValue;
atms.SetAt(&str,&atmValue); // в этой строке помоему происходит утечка памяти

Я примерно представляю почему, по этому и сделал наследование от Cmap и в деструкторе попытался в ручную удалить все ключи и все значения вот так:

POSITION pos = GetStartPosition();
CString *key=NULL;
while(pos){
//CATMRecord atmValue;
GetNextAssoc(pos,key,atmValue);
//atmValue.~CATMRecord();
delete key;
};
};
Но такой деструктор память все таки не очищает, или очищает только ключи,
а вот если раскоментировать двестроки, то я так понимаю, уничтожение значений ячеек массива идет
Но дальше при выходе из деструктора видимо пытается вызваться настоящий родной деструктор CATMRecord atmValue и программа падает

Вобщем может кто подсказать решение чтобы минимально переделывая программу уже готовую избавиться от утечек памяти в Cmap структурах

з.ы. class CMapStringToShortInt2 : public CMap<CString*,CString*,short int,short int>
{

public:
CMapStringToShortInt2(void);
~CMapStringToShortInt2(void);
};
в таком классе я очищаю освобождаю память вот так:
CMapStringToShortInt2::~CMapStringToShortInt2(void)
{
POSITION pos = GetStartPosition();// освобождаем место от Cmap
CString *key=NULL;
short int val;
while(pos)
GetNextAssoc(pos,key,val),
delete key;
}



Для избежания подобного рода проблем юзай спец. утилиту для обнаружения утечек памяти. Например Deleaker.
http://deleaker.ru

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог