「C言語/標準ライブラリ/stdlib.h」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
s/source/syntaxhighlight/g, +aligned_alloc、「例」のコードに、領域確保に失敗したのに、メッセージだけ出しそのままnullptrで処理を続けるバグ多数。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
320 行
 
C言語では、calloc関数やmalloc関数を用いて、メモリ領域を占有できる。このような事を、メモリ領域の確保といい、また、ヒープ (heap) という。通常、下記のようにポインタの宣言の際に修飾として、calloc関数やmalloc関数を使用する。
 
使用が終わったら、free関数を使うことにより、(callocやmallocが)占有していたメモリを解放できる。
 
free関数を使わないでいると、メモリが占有されたままで残りつづける可能性があり、メモリ不足になる。このような、メモリの解放し忘れによるメモリ不足のことをメモリリークという。
 
よく、プログラム解説書では、callocやmallocなどによるメモリ確保は、よく借金に例えられる。借金をしたら、あとで返さないといけないように、メモリを確保したら、あとで解放しないとけいない。
 
:(※ 未確認のノウハウなど: ) mallocやcallocを使わない場合のメモリの管理は、そのOSの仕様にもよるが、普段はOSにメモリ管理の仕組みが任されてたりするのが通常である。このため、mallocやcallocの必要がないなら、mallocなどを使わないでも、かまわないだろう。おそらくmallocやcallocの用途としては、たとえば、メモリが不十分なハードウェアでも動作するようにしたい場合や、あるいは製造業などの組み込みソフトの開発でメモリを直接管理したい場合などに、mallocやcallocが用いられるだろう。
:もし malloc や calloc を用いた場合で、メモリ解法を忘れてメモリーリークが存在していても、けっしてプログラム実行環境は警告しないのが普通である。また、OSの仕様によっては、たとえ、その不具合プログラムを終了しても、メモリ解法されない場合もありうる。なぜならC言語の性質上、OSの制御にも用いられる言語であるので、OSのメモリ管理の権限を越えたコードなどもC言語では書けてしまうからである。
:このため、メモリーリークが他のプログラムの動作に性能低下などの悪影響を与える場合もありうる。もっとも、電源を落として(シャットダウン)して、再起動すれば、シャットダウン時にDRAM内のメモリ情報はいったん無くなるので、個人のパソコンでは、メモリーリークはあまり大問題にはならないだろうから、心配しすぎる必要もないだろう。
 
 
aligned_allocもcallocもmallocも、メモリ領域の占有に成功した場合、返却値として、占有に成功したメモリ領域の先頭アドレスを返却する。占有に失敗した場合、空ポインタを返却する。