Delphi 6, WinXP
Создаю динамический двухмерный массив размер которого превышает размер доступной памяти.
Получаю ошибку о нехватке памяти, пытаюсь освободить массив, как результат память не освобождается.
Как освободить память занимаемую массивом?
Ниже приведенный код и его вариации не работают.
Секции finally и except отрабатываются.
Функции Finalize(matrix) и SetLength(matrix,0) прекрасно работают на небольших массивах, но в данном случае память не освобождается.
var
matrix: array of array of integer;
procedure CreateMatrix;
try
SetLength(matrix,100000,100000);
finally// or except
Finalize(matrix); // or SetLength(matrix,0);end;
end;
Re: Освобождение динамического массива при EOutOfMemory
Здравствуйте, 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;
Здравствуйте, BJk, Вы писали:
BJk>Delphi 6, WinXP BJk>Создаю динамический двухмерный массив размер которого превышает размер доступной памяти. BJk>Получаю ошибку о нехватке памяти, пытаюсь освободить массив, как результат память не освобождается. BJk>Как освободить память занимаемую массивом?
Памяти не хватает, т.е. она и не выделена для массива. Зачем же её освобождать?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
--
К вашим услугам,
Re[2]: Освобождение динамического массива при EOutOfMemory
BJk>>Delphi 6, WinXP BJk>>Создаю динамический двухмерный массив размер которого превышает размер доступной памяти. BJk>>Получаю ошибку о нехватке памяти, пытаюсь освободить массив, как результат память не освобождается. BJk>>Как освободить память занимаемую массивом?
Здравствуйте, Spaider, Вы писали: S>Памяти не хватает, т.е. она и не выделена для массива. Зачем же её освобождать?
Дело в том, что при создании массива у меня начинает выделяться память, выделяется до того момента, пока не кончится (физическая+файл подкачки).
После возникновения EOutOfMemory она не освобождается! Размер свободной памяти равняется единицам мегабайт.
Освобождается только после закрытия приложения =)
Взял я это не с потолка, а из TaskManager с включенной опцией показывать Virtual Memory Size.
По мне тоже было бы логично, чтобы все работало нормально, но есть факт и я не могу ни объяснить его, ни справиться с ним.
Re[3]: Освобождение динамического массива при EOutOfMemory
Здравствуйте, BJk, Вы писали:
BJk>Дело в том, что при создании массива у меня начинает выделяться память, выделяется до того момента, пока не кончится (физическая+файл подкачки). BJk>После возникновения EOutOfMemory она не освобождается! Размер свободной памяти равняется единицам мегабайт. BJk>Освобождается только после закрытия приложения =) BJk>Взял я это не с потолка, а из TaskManager с включенной опцией показывать Virtual Memory Size.
Гм. Выделение памяти в VCL — многоуровневое. Сначала VCL берет память у системы (и это видно через Taskman), а потом отдает уже тебе.
Когда ты освобождаешь память, ты возвращаешь ее VCL. И этого не видно в Taskman.
Если интересно, почитай здесь