- 締切済み
VC++: new の使い方を教えてください。
プログラムで下記のように書くと、例外が発生してしまします。サイズが大きすぎる事が原因のようですが、対処方法とかないでしょうか? それとも、使い方が間違っているのでしょうか? double *test; test = new double[BIGSIZE]; よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- BlueStones
- ベストアンサー率65% (13/20)
確保できるメモリ量は、 仮想メモリのページファイル量の制限値以上には 確保することはできません。 なので、使用できるメモリの量は (制限値)-(ページファイル使用量)=(使用できる量) となり、 これを超えて確保しようとするとnewはエラーとなります。 この制限値を上げるには、 仮想メモリの最大値を上げる事で設定できます。 ただし、ページファイル使用量が物理メモリを超えてしまうと パフォーマンスが低下しますので、物理メモリを増やす事をお勧めします。 これで理解できたでしょうか^_^; あと、newはサイズが大き過ぎる場合は通常はNULLを返すので、 それで確保できたかを確認することができますよ。 ※ ちなみに、ページファイル使用量と制限値の詳細は WindowsXPの場合、 [タスクマネージャ]の[パフォーマンス]の[コミットチャージ]の欄 で見ることができます。
- BlueStones
- ベストアンサー率65% (13/20)
仮想メモリの量を増やしてあげれば、対処できたはずです。 増やし方(WindowsXPの場合) [マイコンピュータ プロパティ]-[詳細設定]-[パフォーマンス 設定] -[詳細設定]-[仮想メモリ 変更] でできます。
- jacta
- ベストアンサー率26% (845/3158)
BIGSIZEの定義内容がわかりませんが、BIGSIZEの評価段階で例外が発生したか、自分でnew演算子を定義しなおしたのでない限り、メモリの割り付けに失敗したことは間違いないようです。 対処方法といっても、何をもってよしとするかによりますが、割付けサイズを小さく出来ないのであれば、一時ファイルを使うなどの方法に切り替えるしかないと思います。
補足
#define BIGSIZE 10000000 です。 new演算子の定義しなおしもしてませんので、メモリの割付に失敗したのだと思います。 回答いただいたとおり、割付サイズを小さくしたくありません。対応方法として一時ファイルを使う、とありますが、具体的にはどのようにするのでしょうか? 参考になる図書等ありましたら、教えてください。
- graphaffine
- ベストアンサー率23% (55/232)
>サイズが大きすぎる事が原因のようですが、 これは何を基にして判断したのですか。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> サイズが大きすぎる事が原因のようですが、対処方法とかないでしょうか? 大きすぎることが原因ならば、小さくしなさい。としか言えません。
補足
#define BIGSIZE 10000000 で、実メモリの使用割合も20%も使っていない状況でしたが(タスクマネージャで確認)、仮想メモリを増やせば対処できるのでしょうか? (仮想メモリは、実メモリと同等の容量を設定してます。)