2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Delphi. Утечки памяти.
Сообщение10.02.2012, 18:33 
Аватара пользователя


30/05/09
121
Киев
Приветсвую. В С/С++ за выделения и возврат динамической памяти полностью отвечает программист. В 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 


16/02/10
258
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 
Аватара пользователя


31/10/08
1244
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 
Заслуженный участник


27/04/09
28128
Pavia в сообщении #537177 писал(а):
Если мы работаем с динамическими массивами, то
A := NIL; - писать не нужно.
А если это не локальная переменная функции, и нам здесь нужно очистить, то всё-таки нужно. :-)

 Профиль  
                  
 
 Re: Delphi. Утечки памяти.
Сообщение10.02.2012, 23:52 
Аватара пользователя


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

 Профиль  
                  
 
 Re: Delphi. Утечки памяти.
Сообщение11.02.2012, 01:11 
Заслуженный участник


27/04/09
28128
Alhimik в сообщении #537265 писал(а):
Короче, принудительное присвоение NIL делать только для динамических массивов, объявленных как глобальные переменные.
Поля объектов и статические поля классов не забудьте! :-)

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


30/05/09
121
Киев
OK!

 Профиль  
                  
 
 Re: Delphi. Утечки памяти.
Сообщение16.02.2012, 22:01 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Delphi. Утечки памяти.
Сообщение18.02.2012, 00:35 
Заслуженный участник


27/04/09
28128
Joker_vD в сообщении #539572 писал(а):
для строк, интерфейсов и динамических массивов встрен простенький сборщик мусора
А с какой версии?

 Профиль  
                  
 
 Re: Delphi. Утечки памяти.
Сообщение18.02.2012, 06:48 
Заслуженный участник


09/09/10
3729
arseniiv
Со второй, кажется. Или с третьей.

 Профиль  
                  
 
 Re: Delphi. Утечки памяти.
Сообщение18.02.2012, 22:09 
Заслуженный участник


27/04/09
28128
О, лучше я тогда молчать буду, пока не поставлю Delphi обратно снова.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group