Здравствуйте, BJk, Вы писали:
BJk>Delphi 6, WinXP
BJk>Создаю динамический двухмерный массив размер которого превышает размер доступной памяти.
BJk>Получаю ошибку о нехватке памяти, пытаюсь освободить массив, как результат память не освобождается.
BJk>Как освободить память занимаемую массивом?
BJk>Ниже приведенный код и его вариации не работают.
BJk>Секции finally и except отрабатываются.
BJk>Функции Finalize(matrix) и SetLength(matrix,0) прекрасно работают на небольших массивах, но в данном случае память не освобождается.
BJk>BJk>var
BJk>matrix: array of array of integer;
BJk>procedure CreateMatrix;
BJk>try
BJk> SetLength(matrix,100000,100000);
BJk>finally // or except
BJk> Finalize(matrix); // or SetLength(matrix,0);
BJk>end;
BJk>end;
BJk>
Пойми одно: если память не выделилась — значит нечего освобождать
var
matrix: array of array of integer;
procedure CreateMatrix;
begin
SetLength(matrix,100000,100000); { не ставь этот код в try блок, память может не выделится и освобождать будет нечего}
try
{ че то делай }
except
SetLength(matrix,0); { мочи ее при ошибке - значит функция плохо отработала }
raise; { ошибку наверх }
end;
end;
1. Динамические массивы не обязательно освобождать самому. Delphi сделает это за тебя неявно. В твоем случае это будет после работы программы.
2. Старайся не использовать глобальные переменные — это плохой стиль программирования
3. Твой вариант лучше рассписать так:
type
TMatrix : array of array of integer;
procedure CreateMatrix (Dimension1, Dimension2 : Integer) : TMatrix;
begin
SetLength(Result, Dimension1, Dimension2);
end;
P.S. Приблизительные подсчеты:
100000*100000*(4 {RefCount} + 4 {Size}) = ~75GB
Мой компьютер загнется