Re: Освобождение динамического массива при EOutOfMemory
От: Danchik Украина  
Дата: 16.05.05 07:37
Оценка:
Здравствуйте, 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
Мой компьютер загнется
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.