メモリ確保失敗に関して – プログラミング – Home

メモリ確保失敗に関して
 
通知
すべてクリア

[解決済] メモリ確保失敗に関して


まだ初心者
 まだ初心者
(@まだ初心者)
ゲスト
結合: 18年前
投稿: 2
Topic starter  

メモリ確保に関していろいろ疑問があるので質問させてください。

■どういう時にメモリ確保に失敗するのか?
いわゆるメモリ(256MBとか512MBとかのやつ)を使い切ったときでしょうか?
仮想メモリ(?)とやらを使い切った時でしょうか?
PCに詳しくないので、よくわからないのですが。

■メモリ確保を意図的に失敗させる方法は?
デバック用です。
単純にNULLを返すのではなくて、本当にメモリが足りなくなって失敗した感じにしたいのです
が・・・・
一時的にメモリ使い切るツールとかがあればいいんですかね?

■メモリ確保失敗した後どうするべき?
アプリケーションを終了させるのが一般的なのでしょうか?
例えば、テキストエディタのアプリでメモリ確保に失敗した場合、「メモリ確保に失敗したのでアプ
リケーションを終了します。編集中のデータを保存しますか? YES or NO」って表示したり、ファ
イル保存したりはできないですよね?(メモリ不足で)
書いてるうちに聞きたいことがよくわからなくorz

環境は以下の通りです。
WindowsXP
VisualC++2005 (一応6.0も持ってる)

メモリ確保失敗後の処理の一例とか、サイト紹介でもいいのでよろしくおねがいします。


引用未解決
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> ■どういう時にメモリ確保に失敗するのか?

OSやコンパイラの種類などでも微妙に違うのですが、VCの掲示板ですからWindows上の話だとする
と、
仮想メモリの方です。512MBとかを超えるメモリでも、あたかもそれがあるかのように動作します。
ただし、Win32の場合、最大でも2GBを超えることは(通常)できません。

■メモリ確保を意図的に失敗させる方法は?

どんな動作をするか簡単に見たいなら、2GB以上のサイズを指定すれば失敗します。
そうでない失敗の場合、プログラムの先頭などで意図的に大容量を確保してしまえば、
その後は失敗するでしょう。
operator newや_set_new_handler等を使う手法もありますが…
興味があれば検索してみてください。

# 使ったことはないですが、意図的に失敗させるシェアウェアなんてのもあるらしい。

> ■メモリ確保失敗した後どうするべき?

まともなソフトの場合、たいていはアプリを終了させるか、
そのメモリを使おうとした処理をキャンセルするかが多いと思います。
(「メモリ不足のため処理を中断します」等)

そして、多くのソフトが、まともな対策がなくてメモリが足りないといきなり不正処理になります。
最近のPCでは現実的に確保に失敗することが少なくなっていることと、
そこまでの信頼性が要求されないこと、コストの問題、作者の技量、等さまざまな事情によります。

本当にデータ保全などの信頼性が要求されるシステムでは、処理が開始される前にすべての
メモリをあらかじめ確保したり(確保できたら成功する/確保できないときは処理をしないことを保
証)、
メモリ不足に陥っても保存処理などができるように、あらかじめメモリを予約しておく等の
対策をとっていることもあります。

> VisualC++2005 (一応6.0も持ってる)

ちなみに、new でメモリ確保に失敗した場合、VS2005とVC6は挙動が違います。
VC6はNULLが帰りますが、VS2005は関数から戻らずにstd::bad_allocという例外が投入されます。
# C++の言語仕様(ISO/IEC14882:2003)が定める正しい動作はVS2005の方です。
# VC6はもっと古いので、これに準拠してません。


返信引用
まだ初心者
 まだ初心者
(@まだ初心者)
ゲスト
結合: 18年前
投稿: 2
Topic starter  

Banさんご回答ありがとうございます。
いろいろ参考になりました。

まだ、悩む部分は残っていますが、これでエラー処理に関して少しは前進できそうです。

あと、newを使った時はtry catch を使わないといけないみたいですね。
今までは new の戻り値が NULL かどうか判定していたのですが、書き直す必要がありそうシクシク

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました