

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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP php エラー 2 2022/10/23 16:43
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
メモリ解析の方法
-
PC-98で拡張メモリを使え...
-
C++のCopyFileでメモリが増える
-
PHP メモリ
-
mod_perlのキャッシュについて
-
大容量のメモリ確保をスワップ...
-
C言語で、メモリを解放しないで...
-
新規購入PCのスペックについて...
-
1ページに収まるオブジェクト...
-
Macターミナルで実行中のプログ...
-
CGIの記述について教えてくださ...
-
PerlScriptでMSAgentをプログラ...
-
winsockを使った通信方法
-
MFCスレッド CriticalSection
-
テキストファイルを読み込んで...
-
マイコンからプログラムを読み...
-
家電製品の電力周波数を変える機械
-
ロータリーエンコーダがうまく...
-
アセンブリ言語の問題
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
「memcpy」と「strcpy」について
-
メモリ不足
-
「ヒープサイズの設定」て何?
-
エクセルのメモリ使用状況/Appl...
-
C言語における再帰呼び出しの...
-
ファイルマッピング関数で失敗
-
ExitProcessの関数コールについ...
-
EXCEL-VBAにてADOのレコードセ...
-
エクセルVBA 大容量CSVファイル...
-
ExcelのVBAでメモリ解放できない
-
メモリを解放しないとどうなる?
-
バッチファイルでの実行EXEのメ...
-
Bitmapを重ね合わせる方法
-
ルネサスマイコン(R8C) ビルド...
-
C,C++プログラムの強制終了時の...
-
C言語:関数のメモリ上でのサイ...
おすすめ情報