• 締切済み

VC++: new の使い方を教えてください。

プログラムで下記のように書くと、例外が発生してしまします。サイズが大きすぎる事が原因のようですが、対処方法とかないでしょうか? それとも、使い方が間違っているのでしょうか? double *test; test = new double[BIGSIZE]; よろしくお願いします。

みんなの回答

回答No.5

確保できるメモリ量は、 仮想メモリのページファイル量の制限値以上には 確保することはできません。 なので、使用できるメモリの量は  (制限値)-(ページファイル使用量)=(使用できる量) となり、 これを超えて確保しようとするとnewはエラーとなります。 この制限値を上げるには、 仮想メモリの最大値を上げる事で設定できます。 ただし、ページファイル使用量が物理メモリを超えてしまうと パフォーマンスが低下しますので、物理メモリを増やす事をお勧めします。 これで理解できたでしょうか^_^; あと、newはサイズが大き過ぎる場合は通常はNULLを返すので、 それで確保できたかを確認することができますよ。 ※ ちなみに、ページファイル使用量と制限値の詳細は WindowsXPの場合、  [タスクマネージャ]の[パフォーマンス]の[コミットチャージ]の欄 で見ることができます。

回答No.4

仮想メモリの量を増やしてあげれば、対処できたはずです。 増やし方(WindowsXPの場合) [マイコンピュータ プロパティ]-[詳細設定]-[パフォーマンス 設定] -[詳細設定]-[仮想メモリ 変更] でできます。

suzumu
質問者

補足

#define BIGSIZE 10000000 で、実メモリの使用割合も20%も使っていない状況でしたが(タスクマネージャで確認)、仮想メモリを増やせば対処できるのでしょうか? (仮想メモリは、実メモリと同等の容量を設定してます。)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

BIGSIZEの定義内容がわかりませんが、BIGSIZEの評価段階で例外が発生したか、自分でnew演算子を定義しなおしたのでない限り、メモリの割り付けに失敗したことは間違いないようです。 対処方法といっても、何をもってよしとするかによりますが、割付けサイズを小さく出来ないのであれば、一時ファイルを使うなどの方法に切り替えるしかないと思います。

suzumu
質問者

補足

#define BIGSIZE 10000000 です。 new演算子の定義しなおしもしてませんので、メモリの割付に失敗したのだと思います。 回答いただいたとおり、割付サイズを小さくしたくありません。対応方法として一時ファイルを使う、とありますが、具体的にはどのようにするのでしょうか? 参考になる図書等ありましたら、教えてください。

回答No.2

>サイズが大きすぎる事が原因のようですが、 これは何を基にして判断したのですか。

回答No.1

> サイズが大きすぎる事が原因のようですが、対処方法とかないでしょうか? 大きすぎることが原因ならば、小さくしなさい。としか言えません。

関連するQ&A