• 締切済み

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

BlueStonesの回答

回答No.5

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

関連するQ&A

  • newとdelete

    動的にaaa[5][40]という配列を作りたいのですけど,以下のプログラムでよろしいでしょうか? aaa = new double *[5]; for(int p = 0; p < 5; p++){ aaa[p] = new double [40]; } また,これをdeleteするときはどのようにすればよろしいのでしょうか? どうぞよろしくお願いいたします.

  • C++のnew演算子について質問です。

    C++のnew演算子について質問です。 以下は関数にポインタを渡して値を得ようしたプログラムです。 ※ディレクティブは省略しています。 void test( int* a ) { a = new int( 100 ); } void main() { int* b; test(b); printf( "%d", *b ); delete b; b = NULL; } このプログラムを実行すると、コンソール画面には100と表示されるかと思っていたのですが、 実際には滅茶苦茶な値と、例外が発生して強制終了しました。 また、関数に渡したポインタのアドレスもNULLとなってしまいます。 そこで以下のようにソースを変更すると正常に100が表示されました。 void test( int** a ) { *a = new int( 100 ); } void main() { int* b; test(&b); printf( "%d", *b ); delete b; b = NULL; } 結果的には目的が達成できたのでいいのですが、なぜこのような動作をするのかが いまいち釈然としません。 new演算子は自動的には破棄されないのではないのでしょうか? 回答の程、よろしくお願いします。

  • new演算子が、インスタンスの参照を返さない!?

    どうもこんにちは。 現在、iアプリ向けプログラムを作成しています。 しかし、あるクラスだけが、インスタンスを作成できない(?) ようです。 他のクラスの記述と、見比べても差がほぼありません。 コンストラクタの中に、何も書かないようにしたりしてもダメでした。 サンプルコードは、これです。 // ---------------------------------------------------------- // Window window = new Window( 10, 15+(15*6),               D.WIN_FLAG_NOCONTROL, 8, 8, 8 ); System.out.println( "エフェクト"+ new Effect() ); //つまり、コンストラクタから参照が得られないのが、問題 Effect effect = new Effect(); System.out.println("effect:"+effect); // ---------------------------------------------------------- // まとめると、Windowクラスのインスタンスは、作れるのに、 Effectクラスは、作れないという事です。 new Effect()のところで、NullPointerException例外が、発生してしまいます。 下記は、Effectクラスのコンストラクタです。 //コンストラクタ Effect() { g = MainCanvas.g; nKey = MainCanvas.nKey; } 特に変わったところは、ありません。 コンストラクタ内の二行を消しても、同じ結果でした。 もしかして、KVMが、壊れたとかでしょうか? ヒープの容量も十分にあったので、それが問題では無いと思いますが、 どうでしょうか? 見直すポイントがあれば、教えて下さい。 お願いします。

    • ベストアンサー
    • Java
  • new型の戻り値? new型のパラメータ?

    あらゆる応用が利くC++ではあるのですが、それによってひとつのやり方にも複数の方法が出てくるのはよくあること。そこで、new型のポインタにおいて戻り値として返せばいいのか、パラメータとして使えばいいのか悩んでおります。 [1] wchar_t *XXX(int size){   wchar_t *ret = new wchar_t[size]   //ポインタに対するいろいろな制御   return ret; } ↑このように、関数内部でnew型ポインタを宣言し、そのポインタのアドレスを外部のポインタに渡す。 [2] static wchar_t ret = new wchar_t; -------- void XXX(wchar_t *ret, int size){   //ポインタに対するいろいろな制御 } ↑関数を呼ぶ手前ですでにnew型ポインタを宣言しておく [1]のほうが、宣言をする手間を省くことができるような気がしますが、new型ポインタがいらなくなったときにdeleteするのをわすれてしまったりということが起きるかもしれないということも考えてしまい、どちらをがメジャーなのかよくわかりません。 皆様ならどういった方法をとりますか? また別な方法がありましたが教えてくださるとありがたいです。

  • reallocとnew

    reallocよりnewの方が優れた部分が多いらしいのでnewを多用するようにしたいのですが、データを保持したままサイズを増やすのはnewでは無理だからreallocよりよい方法はないのでしょうか?

  • new int[変数]で確保しても良いんですか?

    Javaでの配列の確保の方法です。 int size = 100; int[] array = new int[size]; のような確保の方法はどの環境・コンパイラでも思い通りの動作をしてくれますか? C言語では、このような書き方で確保することはできなかったので、Javaでは可能なのか心配で質問しました。 「動的」という意味がまだ完全にわかっていないのですが、上記のような変数の確保は、動的とはいえないのですか?sizeの値をユーザーから受け取れば、確保する大きさはいつも違うようになると思うのですが・・・。 ちなみに下記のようなプログラムで配列の確保を使おうとしています。 static int[] toIntArray(String[] strs){   int[] array = new int[strs.length]; // ←ここで 確保しています。   for(int i = 0; i < strs.length; i++){    array[i] = Integer.valueOf(strs[i]).intValue();   }   return array; } 上記のプログラムはStringの配列からintの配列に変換することを目的にしています。

    • ベストアンサー
    • Java
  • newを使った領域の動的確保

    お世話になります。 C++での記述方法なのですが 構造体Testの領域を確保しておいて値を入れます。 確保しておいた領域では領域が不足するときに 不足分を追加したいのですがどうすればよいでしょう? Cではreallocを使えばよいと思うのですが C++ではmallocではなくnewを使ったほうがよいと聞きました。 newした領域を再定義した場合(deleteせずに領域を追加) 先に領域に入れたデータは保証されるのでしょうか? 以下例文ソース*部分 以下例文のソース Test *a; a = new TEST[10]; int cnt; int i; for(i = 0;i<10;i++){  //ここでTESTの配列aに値を入れる } cnt = 12; if( cnt > 10 ){  //予想サイズを上回ったら足りない分のサイズの領域を確保し  //データを入れる  a = new[cnt];//*ここで領域を再確保したら元のa[0]~a[9]の         //データは確実に保持されるのか?         //または他に領域を確保する方法があるのか? } 上記例文ソースでは先にcntで領域を確保すれば良いようにみえますが やりたいことは 先に確保されている領域を広げて 先に入れてあったデータと、広げた領域に入れたデータを使いたい のです。 分かりにくい文章かもしれませんがよろしくお願いします。

  • VC++でmciSendString

    Visual C++ 2005 Express Editionで以下のコードを書くと Run-Time Check Failure #3 - The variable 'pszReturnString' is being used without being defined. ハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcccccccc に書き込み中にアクセス違反が発生しました。 と出ます。 デバッグ時lpstReturnStringの部分には CXX0030: エラーです: 式を評価できません となっています。引数の型が違っているのでしょうか?原因が分からず困っています・・・。 ----------------- ~クラス宣言(省略)~ Music::Music(std::string fn) : FileName(fn){} PTSTR Music::play() { PTSTR pszReturnString; std::string str = "open " + FileName + " test"; mciSendString((PCTSTR)str.c_str(), pszReturnString, 125, 0); return pszReturnString; } int WINAPI WinMain(・・・) { std::string str = "C:\\test.mp3"; Music test(str); test.play(); }

  • VC++でCatchできる例外について

    DBサーバにて常駐動作させているプロセス(VS6.0にて作成したVC++のプログラム)にエラーが発生して停止してしまいました。 イベントログにてアプリケーションログ、システムログを見ると、以下のようなエラーが出ていました。(日付、ユーザ、マシン名、エラー発生アプリケーション名は伏せております) ■アプリケーションログ■ イベントの種類: エラー イベント ソース: Application Error イベント カテゴリ: (100) イベント ID: 1000 説明: エラー発生アプリケーション <プログラム名>.exe、バージョン 0.0.0.0、エラー発生モジュール MSVCRTD.DLL、バージョン 6.0.8168.0、エラー発生アドレス 0x00011920 ■システムログ■ イベントの種類: 情報 イベント ソース: Application Popup イベント カテゴリ: なし イベント ID: 26 説明: アプリケーション ポップアップ: <プログラム名>.exe - アプリケーション エラー : 例外 unknown software exception (0x80000003) がアプリケーションの 0x10211920 で発生しました。 原因が分からないため、せめて上記エラーが発生しても停止しないよう、主要処理部全体を以下のように例外処理で囲むことで暫定対応しようとしております。 try{  主要処理 }catch(...){  エラー発生時の処理 } 改修後、同様なエラーを模擬的に発生させ、停止しないことを確認しようとしましたが、「エラー発生モジュール MSVCRTD.DLL」となるエラーを発生させることができません。 上記try-catchで「エラー発生モジュール MSVCRTD.DLL」となるエラーがキャッチできるかどうか、ご存知の方はおられましたらご教示いただけないでしょうか? 宜しくお願い致します。

  • VCを通して出しか起動できません

    フリー版VC++2005でゲームを作成しています。 VCからF5でデバッグ起動すれば動作するのですが、 EXEファイルを直接起動した場合は即、いつもの「問題が発生したため…」 が表示されて止まります。 この様な場合の対処方法を教えてください。 OSはWindowsXpです。irrlicht 1.1というライブラリを使用していますのでプログラムのかなりの部分がブラックボックスです。 よろしくお願いします。