проблема с буфером байта длинной 1МБ - PullRequest
2 голосов
/ 02 июля 2011

, поскольку я могу решить эту проблему: я хочу использовать буфер размером 1 МБ или более, с массивом это невозможно, потому что у меня переполнение стека.Я думал о getmem и freemem или об использовании tmemorystream, но не совсем понял, как его решить.Мне нужно использовать буфер для копирования файла, используя tfilestream с возможностью чтения / записи.Я не хочу загружать все нормально за один раз в память и после записи на диск тоже вовремя;для этого я нашел решение, но мне оно не нужно.Спасибо большое.Даниэла.

Ответы [ 3 ]

3 голосов
/ 02 июля 2011

Если у вас переполнение стека, ваша переменная не помещается в стек.Вы явно используете локальную переменную.

Решите проблему, используя вместо этого кучу.Либо GetMem, либо SetLength.

2 голосов
/ 02 июля 2011

Одним из простых решений является использование динамического массива. Их данные размещаются в куче, поэтому вы избежите переполнения стека. Их преимущество перед прямой работой с функциями выделения памяти состоит в том, что они пересчитываются, и выделенная ими память автоматически освобождается после того, как последняя ссылка выходит из области видимости.

var buffer:array of byte;
begin
  SetLength(buffer,100000);
  ...
  //Will be freed here as buffer goes out of scope
end;
0 голосов
/ 02 июля 2011

Ваша буферная переменная размещена в стеке, и максимальный размер стека по умолчанию, используемый компилятором Delphi, составляет 1 МБ.Поэтому решение состоит в том, чтобы установить более высокий лимит с помощью параметров проекта или следующей глобальной директивы:

{$MAXSTACKSIZE 4194304} // eg. now maximum is 4 MiB 

Другой способ - использовать кучу вместо стека, любую из динамически выделяемой памяти, в вашем случае, вероятно, лучшее решение будетбыть динамическим массивом.

Примечание по производительности: стек быстрее, чем куча.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...