Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сработало исключение EOutOfMemory: как оптимизировать память? [D7, XP]


Страницы:   1 2 3 4

yantux ©   (2009-10-12 10:31:00) 

Во время выполнения программы сработало исключение EOutOfMemory.
Полагаю это благодаря активному использованию памяти с помощью безразмерных массивов, длина которых задаётся с помощью setlength();

Постоянно сообщения, что у виндоуса мало виртуальной памяти.
Как можно оптимизировать, уменьшить использование памяти, чтобы программа после использования памяти возращала её системе?


Kolan   (2009-10-12 14:37:00) [41]

>setlength(a,1); (* этого достаточно для освобождения памяти? *)
Странно что не setlength(a, 0);

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


Inovet   (2009-10-12 14:31:00) [42]

> [30] yantux ©   (12.10.09 14:25)
> > КАК заставить программиста вернуть память, занятую изображениями?
>
> > Ответить на этот вопрос без кода НЕВОЗМОЖНО.
>
> var
> a, b : array of integer; (* создаю безразмерный массив *)
>
> begin
> setlength(a,1000000); (* выделяем память *)
>
> ...
> (* пользуюсь массивом a *)
> ...
>
> setlength(a,1); (* этого достаточно для освобождения памяти?
> *)
>
> (* сколько памяти запросит менеджер памяти  у ОС?
> будет ли МП использовать загашник в 1Мб? *)
> setlength(b,2000000);
>
> end;

Кусок в 2000000 для массива нужен непрерывный, если такой найдётся, то не будет.


yantux   (2009-10-12 14:25:00) [43]

> КАК заставить программиста вернуть память, занятую изображениями?
> Ответить на этот вопрос без кода НЕВОЗМОЖНО.

var
a, b : array of integer; (* создаю безразмерный массив *)
begin
setlength(a,1000000); (* выделяем память *)

...
(* пользуюсь массивом a *)
...

setlength(a,1); (* этого достаточно для освобождения памяти? *)

(* сколько памяти запросит менеджер памяти  у ОС?
будет ли МП использовать загашник в 1Мб? *)
setlength(b,2000000);

end;


Игорь Шевченко   (2009-10-12 14:22:00) [44]

На абстрактный код тебе дали абстрактный ответ - [12]


yantux   (2009-10-12 14:18:00) [45]

> есть, но партизанам они не нужны.

Какие проблемы могут помочь решать эти функции? Они влияют на работу setlength? Я в своём проекте поставил почти  все галочки в опциях компилятора. Насколько я понял, только в этом случае делфийный компилятор нормально отлавливает мои ошибки и помогает писать более надёжную программу с точки зрения стабильности работы.


Стенка   (2009-10-12 14:16:00) [46]

> yantux ©   (12.10.09 14:12) [25]
> Правильно ли я понимаю, что ...

Нет


Стенка   (2009-10-12 14:14:00) [47]

> КАК заставить программу возращать память?

Вопрос поставлен неверно. Надо так:
КАК заставить программиста вернуть память, занятую изображениями?

Ответить на этот вопрос без кода НЕВОЗМОЖНО.


yantux   (2009-10-12 14:12:00) [48]

> вообще ты зря ищешь утечки в дельфевском менеджере, ищи в своем коде как советовали.

Я не ищу утечек, поскольку я не использую malloc, new. Правильно ли я понимаю, что для оптимального использования памяти мне достаточно вовремя вызывать setlength(a,1) ?


yantux   (2009-10-12 14:10:00) [49]

> имхо не утечка там, а реально много выделено)

Я так понимаю утечки могут возникать, если вызывать malloc, new и не вовремя delete, free. Я этим не пользуюсь. Только setlength


yantux   (2009-10-12 14:07:00) [50]

> Сдается мне, что указатель там где-то...

Я вообще не использую указателей. Не хочу заморачиваться с malloc и free, именно по этой причине я использую setlength.


Плохиш   (2009-10-12 13:49:00) [51]


> yantux ©   (12.10.09 10:51) [7]
>
> > но как описана a ?
>
> record

Или приводишь его описание, код работы с элементами массива, или иди слесари дальше.


Плохиш   (2009-10-12 13:47:00) [52]

Ахтунг, партизанен. Вешать, вешать и вешать...


Сергей М.   (2009-10-12 13:07:00) [53]


> в этом месте менеджер памяти будет выделять памяьб из своих
> ресурсов


Из своих.


sniknik   (2009-10-12 13:03:00) [54]

> setlength(b,100);// ! в этом месте менеджер памяти будет выделять памяьб из своих ресурсов или запросит у ОС?
из своих.

вообще ты зря ищешь утечки в дельфевском менеджере, ищи в своем коде как советовали.

> Есть ли функйции, опции компилятора, которые влияли бы на работу менеджера памяти?
есть, но партизанам они не нужны.


Стенка   (2009-10-12 13:01:00) [55]

А есть ли функции, опции компилятора, которые влияли бы на работу программиста, размещающего объекты в рекордах?


yantux   (2009-10-12 12:55:00) [56]

> Нет. Она их вернет своему менеджеру памяти. Менеджер памяти совершенно не обязательно побежит срочно их возвращать ОС.

Замечательно. Допустим я делаю:
setlength(a,100);//выделяю память
setlength(a,1);//отдаю менеджеры памяти
setlength(b,100);// ! в этом месте менеджер памяти будет выделять памяьб из своих ресурсов или запросит у ОС?

Есть ли функйции, опции компилятора, которые влияли бы на работу менеджера памяти?


DrPass   (2009-10-12 11:57:00) [57]


> brother ©   (12.10.09 10:48) [5]
> > Если я сделаю setlength(a,1), то программа вернёт ОС память,
>
> > которую занимали 99 эелементов?
>
> да

Нет. Она их вернет своему менеджеру памяти. Менеджер памяти совершенно не обязательно побежит срочно их возвращать ОС.


Dennis I. Komarov   (2009-10-12 11:25:00) [58]


> yantux ©   (12.10.09 10:51) [7]
> > но как описана a ?
>
> record

Сдается мне, что указатель там где-то...


RWolf   (2009-10-12 11:09:00) [59]

Повторюсь, в D7 нет сборщика мусора, вся выделенная компилятором память честно возвращается при выходе за пределы видимости переменной. Мусорить может только сам программист — неосвобождением памяти, которую сам выделил на куче.


yantux   (2009-10-12 11:04:00) [60]

> если хочешь партизанить - не получишь ответ на сабж...

Вопрос не в том, чтобы вы нашли ошибку, спасибо за помощь, но я её сам найду. Вопрос в том, КАК заставить программу возращать память. В Java есть сборщик мусора, который сам, без учатия программиста возвращает память системе. С С++ всё нужно прописывать вручную. В Delphi я новичёк.

Нельзя в Delphi автоматизировать возвращение памяти ОС? Например поставить галочку в опциях компиляции или надо везде вручную прописывать setlength(a,1), чтобы программа возвращала память ОС? Ибо кроме setlength() я ни чего не использую для выделения памяти.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо