fpA=fopen("name1", "r");
fpB=fopen("name2", "r");
fpC=fopen("name3", "r");
if(fpA==NULL || fpB==NULL || fpC==NULL){
exit(1);
}
fpAとfpBのファイルオープンに成功してfpCで失敗した場合、exit(1)によってfpAとfpBはクローズされますよね?
じゃあ、
a=malloc(size);
b=malloc(size);
c=malloc(size);
if(a==NULL || b==NULL || c==NULL){
exit(1);
}
aとbのメモリ確保に成功してcで失敗した場合、aとbのメモリはどうなっちゃうんでしょう?exitは動的メモリも解放してくれるのですか?
とりあえず以下のようにしてますが…。
a=malloc(size);
b=malloc(size);
c=malloc(size);
if(a==NULL || b==NULL || c==NULL){
free(a); free(b); free(c);
exit(1);
}
No.3ベストアンサー
- 回答日時:
最近の普通の OS、Windows や Linux, Mac OSX などでは、プログラムの実行が exit() などで終了すると、そのプログラムの実行で使われていた「資源」をできるだけ使われていなかった状態に戻す、ということをします。
これを「資源の開放」と呼んでいます。ファイルもメモリも OS の概念としては資源という扱いになっていて、後始末を OS が自動的にやってくれます。ですから、fopen() したファイルや malloc() で確保したメモリは、プログラムの終了とともに、プログラム開始前の状態、ファイルだったらクローズ、メモリだったら開放されます。
もしそうしなかった場合、以前に実行したプログラムの影響が残って、次に動かすプログラムの実行に影響が生じる可能性があります。
またこの後処理は exit() の中で行われるのではなく、あくまで OS がプログラムの終了を見張っていて、終了した場合に必ず行われます。もし exit() の中で後処理をしていたとすると、プログラムが異常終了した場合、exit() は呼び出されませんので後処理が行われなくなってしまいます。
このように。プログラム終了時の動作は言語の仕様というよりも OS の仕様です。ですから No.1 さんのおっしゃるように言語仕様としては定義ができないのです。例えば MS-DOS のような「ちゃんとした OS」 ではない場合、開放してくれない場合があったりします。
蛇足ながら、No.2 さんがおっしゃる「共有メモリ」というのは、複数のプログラムの間でデータをやり取りするための特殊なメモリ領域のことです。複数のプログラムから参照されるため、ひとつのプログラムが終了しても他のプログラムから参照している(その時は参照されていなくても、将来参照される可能性がある)ので、開放できないのです。
No.4
- 回答日時:
ちなみにファイルに関しては、abort等で異常終了した場合を除き、プログラム終了時にクローズされることが言語規格上保証されています。
ただし、それはfopen, freopen, tmpfileでオープンしたファイル、およびstdin, stdout, stderrの話であって、非標準関数を用いてオープンしたものは別です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
あなたの「プチ贅沢」はなんですか?
お仕事や勉強などを頑張った自分へのご褒美としてやっている「プチ贅沢」があったら教えてください。
-
人生でいちばんスベッた瞬間
誰しも、笑いをとろうとして失敗した経験があると思います。
-
【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
【お題】追い込まれた犯人が咄嗟に言った一言とは?
-
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
C言語 exitの使い方
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリアクセス時間の計測方法
-
「memcpy」と「strcpy」について
-
[ちょっと息抜き]メモリを解放 ...
-
メモリが不足しています(VBA)
-
メモリを解放しないとどうなる?
-
メモリのセグメント違反の解決...
-
エクセルのメモリ使用状況/Appl...
-
メモリの解放について VB6 VBA
-
プログラム領域の算出方法
-
エクセル キャッシュメモリー...
-
ファイルマッピング関数で失敗
-
クリスタルレポートでメモリ不...
-
プログラムの最大メモリ消費量...
-
C#におけるexeファイルのサイズ...
-
バッチファイルでの実行EXEのメ...
-
マイコンのメモリマップについて
-
エクセルVBA 大容量CSVファイル...
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
「ヒープサイズの設定」て何?
-
C言語における再帰呼び出しの...
-
メモリが不足しています(VBA)
-
【C言語】再帰が時間がかかる...
-
エクセルのメモリ使用状況/Appl...
-
大容量のメモリ確保をスワップ...
-
C#のOutOfMemoryException発生...
-
メモリ不足
-
ファイルマッピング関数で失敗
-
C++のCopyFileでメモリが増える
-
C言語初心者です。debug assert...
-
C言語:関数のメモリ上でのサイ...
-
移動可能メモリ
-
EXCEL-VBAにてADOのレコードセ...
-
VB.netでUSBメモリの固有I...
-
エクセルVBA 大容量CSVファイル...
おすすめ情報