Уничтожение динамических объектов
Использую динамически созданные компоненты. Все функции по созданию описаны в классе.
Собственно код:
{
private:
TTabSheet *Tab;
TButton *But;
TMemo *M1,*M2;
public:
void AddTab(AnsiString Caption);
void AddMemo();
void AddButton();
ObjectItems()
{
Tab = NULL;
But = NULL;
M1 = NULL;
M2 = NULL;
}
~ObjectItems()
{
M1->Free();
M2->Free();
But->Free();
Tab->Free();
}
};
void ObjectItems::AddTab(AnsiString Caption)
{
static int num = 0;
num++;
TTabSheet *tab = new TTabSheet(this);
tab->Caption = Caption;
tab->Name = "Tab"+IntToStr(num);
tab->PageControl = Form1->PageControl1;
ObjectItems::Tab = tab;
}
void ObjectItems::AddMemo()
{
if(ObjectItems::Tab)
{
static int num = 0;
num++;
TMemo *memo = new TMemo (this);
memo->Parent = ObjectItems::Tab;
if(!ObjectItems::M1) ObjectItems::M1 = memo;
else ObjectItems::M2 = memo;
}
}
void ObjectItems::AddButton()
{
if(ObjectItems::Tab)
{
static int num = 0;
num++;
TButton* but = new TButton(this);
but->Parent = ObjectItems::Tab;
ObjectItems::But = but;
}
}
TList *list = new TList;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ObjectItems *a = new ObjectItems;
a->AddTab("Строка");
a->AddMemo();
list->Add(a);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ObjectItems *a;
a = static_cast<ObjectItems*>(list->Items[list->Count-1]);
a->~ObjectItems();
list->Delete(list->Count-1);
}
Дак вот, все работает так как надо, НО я заметил, что при таком использовании, память занятая не освобождается, хотя объекты уничтожаются в деструкторе, при долгом использовании, память довольно сильно забивается.
Работаю с классами недавно так что не ругайте сильно. В инете ничего толкового не нашел по деструкторам и объектам.
Заранее Спасибо! :)
Удаляю объекты вот таким способом:
delete AddressForm;
AddressForm=NULL;
и что-то память никак не уменьшается, почему?
Как измеряешь?
Как, как, в диспетчере задач. как еще можно то ;)
Бгг
Перегрузкой new и delete с подсчетом количества.
Ну это из обрасти фантастики. Нем более что у автора new не используется.
Используется.
private:
TTabSheet *Tab;
TButton *But;
TMemo *M1,*M2;
...
void ObjectItems::AddTab(AnsiString Caption)
{
static int num = 0;
num++;
TTabSheet *tab = new TTabSheet(this);
tab->Caption = Caption;
tab->Name = "Tab"+IntToStr(num);
tab->PageControl = Form1->PageControl1;
ObjectItems::Tab = tab;
}
А не уменьшается - потому что нигде не чистится. Удаление формы не удаляет объекты.
Оксотник имел в виду тот факт, что ТС не использует этот подход.
Только не ТС, а второй вопрошающий PoReX
Мозги плавятся? Поливайтесь водичкой.
Не ужели так трудно посмотреть в тему, вместо того что бы всякую фигню писать?
[off]
мда. ну тогды конешно понятно. Но в принципе об этом еще Лермонтов писал:
Страна рабов, страна господ.
И вы мундиры голубые,
И ты им преданный народ...
А щас даже за стеной Кавказа скрыться не реально - свое нымытое рыло путинка сует повсюду.
Хотя у вас там как оказалось есть еще комсомольцы:
[QUOTE=vlksm]Вода в стандарте пью все время из под крана,запаха нет.[/QUOTE]
хуле. судя по подписи парниша из запоя уж который год не выходит - какой уж там запах.
[/off]
Вобщем ты имел ввиду что второй поциент не использует new?
Но на самом деле это не принципиально - память все равно будет чистится - ведь во первых выделение происходит при вызове CreateForm по сути вызывается именно он - это раз. А второе - указатель на форму является глобальным. И это важно. Поэтому у него и не происходит очистки памяти - он забыл убрать форму из Auto-create в Available. Можешь сам проверить.
Первый кстати тоже вполне получит такие же бока. У него указатель может переопределятся произвольное количество раз - а предыдущий объект никто нужным удалять не считает.
Вобщем ты имел ввиду что второй поциент не использует new?
Но на самом деле это не принципиально - память все равно будет чистится - ведь во первых выделение происходит при вызове CreateForm по сути вызывается именно он - это раз. А второе - указатель на форму является глобальным. И это важно. Поэтому у него и не происходит очистки памяти - он забыл убрать форму из Auto-create в Available. Можешь сам проверить.
Первый кстати тоже вполне получит такие же бока. У него указатель может переопределятся произвольное количество раз - а предыдущий объект никто нужным удалять не считает.
Создаваемая форма находится в Available. Т.е. нужно сделать ее локальной? Память проверяю через диспетчер задач.
после удаления указателя формы.
Значит причина утечек не в этом коде вероятнее всего. Хотя я например предпочитаю использовать локальные указатели и вызывать явно new.
У меня приведенный ниже код очищает память полностью:
Form2->ShowModal();
delete Form2;
Form2 = NULL;
Ищи меморилики в других местах. Либо на создаваемой форме у тебя находится компонент требующий дополнительных шагов для закрытия. Либо ты привел не весь код (а в чем смысл создания и сразу же удаления?) и у тебя гдето происходит переопределение указателя.
У меня приведенный ниже код очищает память полностью:
Form2->ShowModal();
delete Form2;
Form2 = NULL;
Даже этот код в новом проекте не очищает. Только 100Кб освобождаются после закрытия формы. По крайней мере в диспетчере так.
Ищи меморилики в других местах. Либо на создаваемой форме у тебя находится компонент требующий дополнительных шагов для закрытия.
Пробовал сначала удалить все компоненты, а потом форму - эффект тот же.
.....(а в чем смысл создания и сразу же удаления?) .....
Там в конструкторе ShowModal() стоит.
Вот ниже мой код
Я бы возможно сделал бы замечания по архетектуре приложения - но принципиальных ошибок вроде нет. Как нет и утечек памяти. Памяти освобождается ровно столько, сколько и выделяется - рост объема памяти для приложения связан с системными механизмами оптимизации.
Все это с одной оговоркой - я тестировал проект под 6 билдером - соотвественно под студией могут быдь немного другие проблемы.