• ベストアンサー

C++ メモリの動的確保について

C++のメモリの動的確保について、以下のことが分からないので、教えて頂けないでしょうか? 適切にメモリ確保が行えていたとしても,あることに注意しないと実行時にプログラムが不正に停止することがある.「あること」について,また「あること」が起こるプログラムの例を示せ. いろいろ探したり試したりしたのですが、うまく説明できる内容が思い浮かびませんでした。 どうかよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

実行時エラーを出すのなら、手元のVisualC++ 2010 Express、Windows7の環境なら、 #include <stdio.h> #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) {  char *mem;  mem = (char*)malloc(10);  mem[0x00000001] = 1; // ここは有効な領域内なので当然OK  mem[0x00000010] = 1; // ここは有効な領域外だがセーフ  mem[0x00000100] = 1; // ここも有効な領域外だがセーフ  mem[0x00001000] = 1; // ここで実行時にアクセス違反の例外が発生してプログラムが停止する  mem[0x00010000] = 1;  mem[0x00100000] = 1;  mem[0x01000000] = 1;  mem[0x10000000] = 1;  return 0; } とか。 > 実行すらできずに落ちる(停止)するにはどうすればいいのか いよいよ意味不明です。 コンパイル、リンク出来て、作成された実効形式(Winなら.exe)は、例外なく(1ステップでもって意味で)実行可能だと思いますが。 テキトーなテキストファイルの拡張子を.exeに変更したファイルなんかは、最近のWindowsでは実行できないようにチェックされてはじかれます。が、これはプログラムの問題で実行できないのと別の話。 Unixでファイルに実行権限が無くて実行できないのも、プログラムがどうこうで実行できないわけではないですし。 そもそも、「落ちる(停止)する」ってのは、何かしら実行された結果では。

noname#225287
質問者

お礼

私の説明が下手なばかりに迷惑をかけてしまい申し訳ございません。 大学の試験の過去問に出ていたのですが、私自身、言ってることが理解できず、求められている解答の見当がつきませんでした。 ただ、解答は複数考えられる、とは表記されていました。 みなさんの解答を参考に考えてみたいと思います

その他の回答 (5)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

なんとなくですけど、メモリを開放せずに確保し続けると、メモリが足りなくなるとか、一度開放したメモリを2度開放してはいけないとかそういう答を期待した設問なのかも。 いずれにしてもよくわからない設問ですね。どこに書いてあったんですか?

  • yymddttmm
  • ベストアンサー率34% (31/91)
回答No.4

設問?自体が曖昧、意味不明だから説明のしようがない。 たとえばアクセス違反で停止しても処理系の仕様による正常処理だから不正ではないとも言える。 どうなったら停止するかはOS、H/Wと処理系の問題であってC++の言語仕様とは関係ない。 再帰性呼び出しでスタックオーバーフローもあり得る。 HWによっては冷却ファンを強制停止して熱暴走も有りかな。

  • weavaest
  • ベストアンサー率15% (157/1020)
回答No.3

確保したメモリに対しての「あること」なのですか。つまり他の回答者が仰るような確保した領域外へのアクセスは、「あること」に該当しないのでしょうか。また、静的に確保したメモリでは起きず、動的に確保したメモリでしか起きないことなのでしょうか。 何だか漠然とした質問のために、回答し辛い気がします。

noname#225287
質問者

補足

例えば、int型で固定長配列p[10]を動的に確保したとして、p[-10]とかp[100]とかは普通にアクセスして使用できてしまうのですが、おそらく実行すらできずに落ちる(停止)するにはどうすればいいのかを聞いているのではないかと思います。

  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.2

確保したメモリー外のところをアクセスした。 例えば10バイトしか確保していないのに10文字を入力した。 インデックスがマイナスになってしまった。など

回答No.1

例えば、確保したメモリの外側にアクセスするとか。 > また「あること」が起こるプログラムの例を示せ. 例えば、 char型で10バイトのメモリを確保。 sprintf関数で、"Hello World!!"の13バイトの文字列を書き込み。 とか。 プログラムを不正に停止させる例でなくて、アクセス違反する例でいいんですよね? 停止するかどうか?は、処理系なんかによりますし。

関連するQ&A

専門家に質問してみよう