Приветсвую. В С/С++ за выделения и возврат динамической памяти полностью отвечает программист.
Где-то читал что в С++ теперь тоже есть автоматическая сборка мусора.
Цитата:
В 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 он доступен в исходных кодах.