2011-07-02 3 views
2

のバッファで問題があります。私はgetmemとfreemem、またはtmemorystreamを考えたことがありますが、それを解決するのに厳密には理解していません。私には、読み書き可能なtfilestreamを使ってファイルをコピーするバッファを使う必要があります。 私は一度にメモリにすべての負荷をうまく負荷したくないし、ディスクに書き込んだりしています。それのために、私は解決策を見つけましたが、それは私には必要ありません。 ありがとうございました。ダニエラ。私はこの問題を解決することができます:1MB以上のバイトのバッファを使用したい、私はスタックのオーバーフローがあるので、配列でそれが可能ではありません1MB

+0

エラーが発生するため、配列の代わりにメモリ関数を使用するのは悪い方法です。スタックオーバーフローが発生する理由を理解してください。あなたはおそらくループ中または再帰関数内にいるでしょうが、問題はループ内でプログラミングエラーを起こしたようなものです。 – az01

+0

実際、彼の問題*は配列の割り当てにあります。再帰とは関係ありません。 1 MBの通常のスタックサイズなので、このような大きなチャンクを使用したい場合、ヒープに移動する必要があります。 –

+0

@ az0典型的なスタックの合計サイズは1MBです(私はリンカにそれを変更するように指示することができると思いますが、これは正しいことではありません)。スタックに1MBの配列を割り当てるのは間違っており、OPの問題です。ヒープに大きなデータを割り当てることは正しいことです。 – CodesInChaos

答えて

3

スタックオーバーフローが発生した場合、変数はスタックに収まりません。あなたは明らかにローカル変数を使用しています。

代わりにヒープを使用して問題を解決してください。 GetMemまたはSetLengthです。

2

簡単な解決策の1つは、ダイナミックアレイを使用することです。それらのデータはヒープ上に割り当てられますので、スタックオーバーフローを避けることができます。メモリ割り当て関数を直接操作することの利点は、それらがrefcountされ、割り当てられたメモリが最後の参照が範囲外になると自動的に解放されることです。

var buffer:array of byte; 
begin 
    SetLength(buffer,100000); 
    ... 
    //Will be freed here as buffer goes out of scope 
end; 
0

バッファ変数はスタックに割り当てられ、Delphiコンパイラで使用されるデフォルトの最大スタックサイズは1 MiBです。だから、解決策は、プロジェクトのオプションまたは次のグローバルディレクティブを使用して上限を設定することです:

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

他の方法は、ヒープの代わりにスタックを使用することで、動的に割り当てられたメモリのいずれか、あなたのケースでは、おそらく最良の解決策になりますダイナミックアレイ。

パフォーマンスノート:スタックはヒープより高速です。

+0

によって制御されます。スタックサイズの増加は危険を伴います。アプリ内の各スレッドはその仮想メモリを予約する必要があります。それを上げることは、アドレス空間に圧力をかけます。ヒープは大きなブロックのために行く方法です。 –

+0

@David Heffernan、スタックは32ビットWindowsでは安価なので、これらの「危険」は心配する実用的な問題ではありません。 –

+0

マルチコアマシンで安いわけではありません。 4GBのアドレス空間は、64ウェイ・マシンと4MBスタックで素早く食べられるという。 –

関連する問題