1

そうです、この問題を調べたところ、クラス定義に、演算子を使用してスペースを割り当てること wchar_t downloadedText[400000]; でこれに対処する方法についての解決策を読んだことが原因であると考えています。newwchar_t *downloadedText; downloadedText = new wchar_t[400000];

ただし、クラスのインスタンスをファイルに書き込む必要があり、上記のように変数を割り当てると、ポインターを使用して、ファイルに書き込まれない方法で保存されたデータを指すように見えます。使えないのも同じ理由std::vectorです。

私が持っているかもしれない別のオプションは、「スタック」のサイズを増やすことができるということです。IDE として VS2010 を使用し、プロジェクト プロパティ > リンカー > システムの [スタック コミット サイズ]、[スタック予約サイズ]、[ヒープ コミット サイズ]、および [ヒープ予約サイズ] フィールドに配置しましたが、これが正しいかどうかはわかりません。問題に対処する方法と、問題がある場合は、適切なフィールドを正しく設定する方法。

4

4 に答える 4

3

このようにしなければならない場合...オブジェクトを書き出した後、配列を明示的に書き込むことができます。例えば。

write((char*)&myObjects[i]), sizeof(MyClass));
write((char*)downloadedText, sizeof(downloadedText[0]) * 400000);

そしてそれを読み返すには:

read((char*)&myObjects[i]), sizeof(MyClass));
downloadedText = new wchar_t[400000];
read((char*)downloadedText, sizeof(downloadedText[0]) * 400000);

ただし、これは非常に壊れやすく、エラーが発生しやすくなります。読み取りによって行われるようにメモリ内のオブジェクトを上書きすることは、通常は POD のみを含む、その目的のために明示的に作成された構造体を使用している場合を除いて、せいぜい悪い形です。少なくとも、読み取りによって上書きされた後に、downloadedText メンバー フィールドを設定する必要があることに注意してください。

于 2012-05-03T06:02:17.603 に答える
2

演算子を使用してオブジェクト全体newをシステム ヒープに割り当てることはできますが、スタックには割り当てることができません。この場合、このオブジェクトを同じ方法でファイルに書き込むことができ、スタック オーバーフローの問題は発生しません。

于 2012-05-03T05:40:39.723 に答える
1

はい、リンカー オプションを使用して、Visual Studio でスタック サイズを増やすことができます/STACK。このリンカー オプションは、プロジェクト プロパティのStack Reserve SizeおよびStack Commit Sizeで編集することもできます。予約サイズを設定するだけで十分です。コミット サイズはオプションです。それでも、 も使用できるはずですstd::vector

于 2012-05-03T06:34:02.707 に答える
0

現在のシリアライゼーション戦略 (オブジェクトを POD にして、POD 値として書き込む) で問題ないようです。その場合、あなたの質問は本当に「これらのオブジェクトがスタック上のスペースを占有しすぎないようにするにはどうすればよいですか?」ということです。答え: それらをスタックに置かないでください。

それらを new で割り当てます。または、できれば、何らかのスマート ポインターでそれらをラップします。


文字列のようなデータがあります。たまたま C++ が文字列クラスを提供しています。実際、あなたはキャラクターについて話しているので、 (ヘッダーwchar_tで)見たいと思っています。std::wstring<string>

于 2012-05-03T06:16:28.720 に答える