メモリリークの発生に注意する
realloc関数では、再割り当てが失敗した際には元オブジェクトのポインタが解放されないままとなります。上記の例ではポインタ変数 ptr のアドレスは空ポインタとなるため、元オブジェクトへのアドレスが失われてしまいます。そのため上記のmalloc関数で確保したオブジェクトは解放されないままとなり、メモリリークが発生することになります。 realloc関数利用時には必ず、一時変数を利用して空ポインタのチェックを行うようにし、再確保の失敗時には必要に応じて元オブジェクトを解放する必要があります (解放せずにそのまま使い続けることも可能です) 。
void *ptr = malloc(1); void *tmp = realloc(ptr, 2); if (tmp == NULL) < /* 失敗時 */ free(ptr); // 必要に応じて元オブジェクトを解放 return NULL; > elseメモリの断片化を引き起こしやすい
reallocでは、元のメモリのアドレスと、再確保後のメモリのアドレスが異なるアドレスになる場合があります。これは、realloc時にメモリの空きブロックが足りず、元のメモリブロックを十分な長さに拡張できないような場合に、より広いメモリ領域にメモリブロックが移動されるためです。 その際、メモリブロックの余計な移動作業やコピーが発生するため、余計な処理コストの発生やパフォーマンスの低下に繋がるほか、頻繁な移動によってメモリの断片化(フラグメンテーション)を引き起こしやすくなる場合があります。また頻繁なreallocの利用は断片化の影響を受けやすいという懸念もあります。 これらの問題を回避するには、事前に大きめのメモリサイズを確保し、再確保の回数を極力減らすような工夫が必要となります。
realloc(ptr, 0)について
realloc関数の第一引数に指定された元オブジェクトが空ポインタ以外の場合でかつ、第二引数のサイズに0が指定された場合の処理( realloc(ptr, 0) )について、以前は元オブジェクトに対する解放処理( free(ptr) )が働くと言われていましたが、現在では異なる挙動をとる場合があるため、誤って利用しないよう注意する必要があります。 実際に、現在では処理系によって異なる挙動がとられています。手元のClangコンパイラでは同処理系における malloc(0) と同等の挙動を取るようです。元オブジェクトは解放されますが、戻り値はNULLではなく、新たに割り当てられたオブジェクトとなります。
void *a = malloc(1); void *b = realloc(a, 0); assert(b != NULL && a != b); free(b); free(b); // error for object 0x0000000100403ab0 free(a); // error for object 0x0000000100402170 コードの移植性を考慮する場合、reallocの解放処理としての利用は極力避ける必要があります。 カテゴリー: C言語 | タグ: 基礎知識, 言語仕様, 詳細解説, 豆知識 | 投稿日: 2017.05.04 | 更新日: 2017.12.08 | 投稿者: MaryCore C言語- 数値を 2進数 8進数 10進数 16進数 文字列に変換する方法
- 文字列をコピーする方法【危険なstrcpy関数と安全な文字列複製】
- strcpy関数/strncpy関数【詳解|危険性と注意点 strlcpyの脆弱性】
- 文字列を連結・結合する【strcatの危険性とsnprintfの安全性】
- strcat関数/strncat関数【完全解説|危険性と注意点】
- typedef struct による構造体の定義|一般的な宣言との違いや目的
- 複合リテラル【完全解説、生存期間、注意点、構造体/配列リテラル】
- 文字列の一部を表示する|部分文字列の出力【printf substringイディオム】
- fmod関数|float/double型の割り算の余りを求める方法【浮動小数点数の剰余】
- 2進数 8進数 10進数 16進数 文字列を数値に変換する方法
- 地球が滅びる時に流れる曲を編曲しました
- 今月のポエム|道に従う
- かぐや姫が地球に残ったときの曲を作りました
- コメ離れの理由は小麦の安心感
- 現代人がバロック音楽みたいな練習曲を作りました
- ししろん ラーメンツアー「ナレーション担当」まとめ
- 弱者男性という蔑視表現が男性社会に与える影響
- Z世代が酒を飲むようになった理由は所得増加なのか
- なぜリベラルは成り立たないのか・無意味になるのか
- 嘘なのか本当なのか分からない絶妙な豆知識
- 月収6万円の「いかがでしたかブロガー」を見て思ったこと|哀れなトレンドブログの実態
- プログラミング教育ビジネスの闇|胡散臭いプログラミングスクール
- IT業界のエンジニア職に幻想を抱きすぎだと思う|プログラマ・SEはキツイ
- 庶民はFIREを目指すべきではない|早期リタイアの罠
- SDGsは庶民が多くの負担を強いられるだけ|胡散臭いSDGsの支配構造