2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Delphi. Утечки памяти.
Сообщение10.02.2012, 18:33 
Аватара пользователя
Приветсвую. В С/С++ за выделения и возврат динамической памяти полностью отвечает программист. В Delphi я что-то не догоняю. Допустим для вещественного массива A : array of double; Для выделения памяти необходимо
вызывать SetLenght(A, 100); // например.
Для её возврата необходиомо A := NIL; (Это действительно так?)
И еще, допустим, если идут подряд:

SetLength(A, 100); // память 1
SetLength(A,1000); // память 2
A := NIL;

В таком случае память 1 возвращается или остаётся висеть?

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение10.02.2012, 19:19 
Alhimik в сообщении #537100 писал(а):
Приветсвую. В С/С++ за выделения и возврат динамической памяти полностью отвечает программист. В Delphi я что-то не догоняю. Допустим для вещественного массива A : array of double; Для выделения памяти необходимо
вызывать SetLenght(A, 100); // например.
Для её возврата необходиомо A := NIL; (Это действительно так?)

Да.
Цитата:
И еще, допустим, если идут подряд:
SetLength(A, 100); // память 1
SetLength(A,1000); // память 2
A := NIL;
В таком случае память 1 возвращается или остаётся висеть?


Тут нет никакой памяти 2. Просто указателю A сначала сопоставляется объем памяти длиной 100, затем этот объем увеличивается (на то она и динамическая память) до 1000. Потом этот массив освобождается. Программисту ни о чем беспокоиться не нужно.

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение10.02.2012, 21:06 
Аватара пользователя
Alhimik в сообщении #537100 писал(а):
Приветсвую. В С/С++ за выделения и возврат динамической памяти полностью отвечает программист.

Где-то читал что в С++ теперь тоже есть автоматическая сборка мусора.

Цитата:
В Delphi я что-то не догоняю. Допустим для вещественного массива A : array of double; Для выделения памяти необходимо
вызывать SetLenght(A, 100); // например.
Для её возврата необходиомо A := NIL; (Это действительно так?)
И еще, допустим, если идут подряд:

Код:
SetLength(A, 100);     // память 1
SetLength(A,1000);   // память 2
A := NIL;

В таком случае память 1 возвращается или остаётся висеть?

Лучше почитать Help там всё расписано.

Далее речь пойдёт про динамические массивы. Строк типа string это тоже касается.
Если мы работаем с динамическими массивами, то
A := NIL; - писать не нужно.
По выходе из процедуры, если массив объявлен в локальных переменных вызывается его очистка и при необходимости освобождение.
Делается это с учётом ссылок на объект. Так что если nil не написать, то утечки всё равно не будет.
Код:
SetLength(A, 100);     // память 1
SetLength(A,1000);   // память 2

Тут утечки не происходит, так как SetLength вызывает RellocMem.
RellocMem действует так. Выделяется память под новый массив. Она зануляется. Затем из старого массива копируются данные в новый. Место занятое под старый массив освобождается.
Команды SetLength(A,0); a:=nil; аналогичны.

Более того. Если элементами динамического массива являются объекты, то освобождение динамического массива вызывает Free для объектов. А если элементами динамический массив является динамические массивы то функция очистки(освобождения) массива вызывается рекурсивно.

Всё это можно посмотреть в модуле system.pas он доступен в исходных кодах.

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение10.02.2012, 23:24 
Pavia в сообщении #537177 писал(а):
Если мы работаем с динамическими массивами, то
A := NIL; - писать не нужно.
А если это не локальная переменная функции, и нам здесь нужно очистить, то всё-таки нужно. :-)

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение10.02.2012, 23:52 
Аватара пользователя
Спасибо. Просветили. Короче, принудительное присвоение NIL делать только для динамических массивов, объявленных как глобальные переменные.
На счет автоматического сборщика мусора в С++ не слышал. Так что запрашиваю подробные ссылки по этому вопросу. Там всегда было два способа: void free(void*) или delete ..., delete [] ... . А чтобы динамическая память, выделенная void* malloc(...) или new возвращалась при помощи автоматического сборщика - что-то дейтсвительно новое, явно не в духе С/С++.

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение11.02.2012, 01:11 
Alhimik в сообщении #537265 писал(а):
Короче, принудительное присвоение NIL делать только для динамических массивов, объявленных как глобальные переменные.
Поля объектов и статические поля классов не забудьте! :-)

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение11.02.2012, 16:38 
Аватара пользователя
OK!

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение16.02.2012, 22:01 
Ну, в С++ самоосвобождаются локлаьные объекты (которые из стека), а так — new/delete. В Delphi также нужно пользовать пару Create/Destroy (объекты) или New/Dispose (указатели на типы), но там для строк, интерфейсов и динамических массивов встрен простенький сборщик мусора — за что им огромное спасибо. А, и еще кажется Variant... насчет него не уверен.

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение18.02.2012, 00:35 
Joker_vD в сообщении #539572 писал(а):
для строк, интерфейсов и динамических массивов встрен простенький сборщик мусора
А с какой версии?

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение18.02.2012, 06:48 
arseniiv
Со второй, кажется. Или с третьей.

 
 
 
 Re: Delphi. Утечки памяти.
Сообщение18.02.2012, 22:09 
О, лучше я тогда молчать буду, пока не поставлю Delphi обратно снова.

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group