【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

環境

Windows 7 (64 bit) RAM 16.0GB
Visual Studio 2008
※プロジェクトの設定は64bit



C++/CLIにおいて、

int SIZE = 1438*1438*998;
array<short>^ a = gcnew array<short>( SIZE );

がOutOfMemoryで終了してしまいます。


同様のことを、同じプロジェクトでテストコードとして
short* a = new short[ SIZE ];

としてみると正常に動作するようです。

なお、実際のプロジェクトではSIZEはファイルから読み込みます。

開発されてから今まで(数年)、SIZEの値がこれほど大きくなることはありませんでした。

・型指定をshortからcharにすればOutOfMemoryにならない
・しかしnewでの配列確保では正常に動作しているためメモリ不足とは考えにくい
・new演算子のサイズ指定はsize_t(=unsigned 64bit)だがarrayはint(signed 32bit)しか見当たらないのも気になるが、いずれにせよオーバーフローには一億近く足りない

という具合で原因がわからずに困っています。

・そもそも何が原因なのか
・可能な限り現在のコードを変更せずに(gcnew arrayのまま)解決するならどうするのがよいか

を教えていただけないでしょうか。

また、原因に関しては信頼できる情報源を提示いただけると助かります。(英語可)。

A 回答 (2件)

http://msdn.microsoft.com/ja-jp/library/system.a …
> 既定では、Array の最大サイズは 2 GB の (GB) です。
> 64 ビット環境では、ランタイム環境の true へ gcAllowVeryLargeObjects の構成要素の enabled の属性を設定すると、サイズの制限を回避できます。

……だそうです。
short型(2バイト)で要素数1438*1438*998だと、約3.8GBになりますね。
    • good
    • 1
この回答へのお礼

おかげさまで、アプリケーション構成ファイルをいじる必要があることまでたどり着けました。
試してみます。ありがとうございました。

お礼日時:2014/01/09 10:53

既に回答がついていますが



>・しかしnewでの配列確保では正常に動作しているためメモリ不足とは考えにくい

newとgcnewはヒープが異なりますから(newはネイティブヒープ, gcnewはマネージヒープ)、newで確保できたのだからgcnewでも確保できるはずというのは成り立ちません。
    • good
    • 0
この回答へのお礼

>newとgcnewはヒープが異なりますから

想像もしていませんでした。貴重なご指摘をありがとうございました。

お礼日時:2014/01/09 10:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報