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

Ваш аккаунт

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

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

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

освобождение памяти

9.8K
19 января 2006 года
Korse
11 / / 20.05.2005
Проблема вот в чем есть: массив, который заполняется Динамически.
Код:
//Header
class TForm1 : public TForm
{
-----------Cuted-----------
public:     // User declarations
        TList *MyList;// создается при создании формы
-----------Cuted-----------
};

TImage *Ar[5001] ;
int *s;

//===========================================
//Implementation

void __fastcall TForm1::Button5Click(TObject *Sender)
{
 int i;
 s= new int[5001];
 for (i=0;i<5000;i++) Ar=new TImage(Form1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
 int i;
 for (i=0;i<5000;i++) delete Ar;
 delete[] s;
}


Сразу сделай оговорку: следил за показаниями диспетчера задач (памяти ,используемой процессом)

Так вот при создании даного массива TList и заполнения его пустыми TImage (взят для примера с о структурами происжодит тоже самое) память увеличивается, но при освобождении память изменяется либо незначительно либо вовсе не изменяется.
В Делфи ситуация анологичная.

P.S.: критика приветствуется.
4.8K
19 января 2006 года
Вася Триллер
149 / / 30.10.2005
Это затем, чтобы не тормозило.
Если тебе вновь понадобится память, то она уже будет выделена, экономя время.
1
19 января 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Korse
Проблема вот в чем есть: массив, который заполняется Динамически.
Код:
//Header
class TForm1 : public TForm
{
-----------Cuted-----------
public:     // User declarations
        TList *MyList;// создается при создании формы
-----------Cuted-----------
};

TImage *Ar[5001] ;
int *s;

//===========================================
//Implementation

void __fastcall TForm1::Button5Click(TObject *Sender)
{
 int i;
 s= new int[5001];
 for (i=0;i<5000;i++) Ar=new TImage(Form1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
 int i;
 for (i=0;i<5000;i++) delete Ar;
 delete[] s;
}


Сразу сделай оговорку: следил за показаниями диспетчера задач (памяти ,используемой процессом)

Так вот при создании даного массива TList и заполнения его пустыми TImage (взят для примера с о структурами происжодит тоже самое) память увеличивается, но при освобождении память изменяется либо незначительно либо вовсе не изменяется.
В Делфи ситуация анологичная.

P.S.: критика приветствуется.


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

9.8K
19 января 2006 года
Korse
11 / / 20.05.2005
Цитата:
Originally posted by Вася Триллер
Это затем, чтобы не тормозило.
Если тебе вновь понадобится память, то она уже будет выделена, экономя время.

Согласен ,но небудет ли проблем т.е отказа в выделении памяти ,если взять тотже массив более крупного размера (предел доступной памяти (физ+вирт)),потом освободить и запустить другую копию того же приложения и повторить создание того же массива. ( в теории)

И в дополнение не подскажет кто-нибудь направлеение или название ф-ии полученя инф об исп памяти самим приложением

406
20 января 2006 года
vitaly2003s
481 / / 27.07.2004
И в дополнение не подскажет кто-нибудь направлеение или название ф-ии полученя инф об исп памяти самим приложением [/QUOTE]

Смотри VirtualQuery
1
20 января 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Korse
Согласен ,но небудет ли проблем т.е отказа в выделении памяти ,если взять тотже массив более крупного размера (предел доступной памяти (физ+вирт)),потом освободить и запустить другую копию того же приложения и повторить создание того же массива. ( в теории)


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

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