2

私は視覚的なC ++アプリケーションを実行しており、サイズをバッファに割り当てようとしています(そのバッファは、ストリームのコンテンツを格納するためにさらに使用されます)。バッファに宣言されたサイズが以下の場合は問題ありません

const int size= 319000; //here there is no problem

しかし、ストリームから希望のデータにアクセスするには、次のようなサイズのバッファを宣言する必要があります-

const int size=4348928;//this size cause the problem
char buffer[size+1];
HRESULT hr = pStream->Read(buffer, size, &cbRead );

コードの最後の 2 行は、私の問題に対処する役割はありませんが、このバッファーのサイズで正確に何をしているのかを理解するためのものです。

しかし、このサイズを宣言しても何もしません (つまり、このようなビジュアル アプリケーション関数を意味します: ファイルをクリックするとストリームが生成され、そのストリームをバッファーに格納します。319000 のオーダーのサイズを宣言すると、プログラムは正常に実行され、サイズを 4348928 に増やしても機能しません - もちろんエラーはありません)

4

3 に答える 3

9

がローカル変数の場合buffer、配列をスタックに割り当てようとします。スタックは通常、低メガバイト範囲 (1 から 4 など) にあります。4 メガバイト以上を割り当てようとしましたが、うまくいきません。

これを解決する簡単な方法は、ヒープから動的に割り当てることです。

char* buffer = new char[size + 1];

// Do operations on `buffer`

delete[] buffer;
于 2013-07-26T10:54:41.380 に答える
0

これは、静的データがスタックに格納され、そのサイズが数 MB であるためです。メモリを動的に割り当てると、データはヒープに入り、はるかに大きくなります。

あなたの場合、コンテナを使用します。おそらくvector

std::vector<char> buffer(size);

コンテナーはポインターよりも安全であり、動的割り当てよりもはるかに安全です。これは、コンテナーを使用しなくなった場合にコンテナーが自動的に削除されるためです。また、別の値をプッシュするだけで、コンテナーのサイズをいつでも安全に増やすことができます。

関数に渡す必要がある場合は、参照を渡すことができます (おそらく最良のオプションです)。ただし、これを行うことで最初の要素へのポインターを渡すことが&buffer[0] できvectorます:

さらに、データへのポインターを取得することで、すべてのコンテナーを反復処理できます。

for (std::vector::iterator it = buffer.begin(); it != buffer.end(); ++it)
{/*some stuff*/}

反復は、どのタイプのコンテナでも同じように見えます。

さらに、4348928 文字を割り当てると、約 4MB になります。しかし、割り当てる必要がある場合は、new通常は で 300MB の割り当てが失敗します (と同じvectorです)。このような大きな割り当てには、 を使用する必要がありますstd::deque

于 2013-07-28T13:42:26.560 に答える
-1

ローカル関数メモリがスタックから割り当てられ、それほど多くのフェッチを取得できないため、ポインターを使用します。

于 2013-07-26T10:58:42.633 に答える