Cのrealloc関数に関する簡単な質問:reallocを使用して、ポインターが指しているメモリブロックを縮小すると、「余分な」メモリが解放されますか?それとも、どういうわけか手動で解放する必要がありますか?
たとえば、私が
int *myPointer = malloc(100*sizeof(int));
myPointer = realloc(myPointer,50*sizeof(int));
free(myPointer);
メモリリークは発生しますか?
いいえ、メモリリークは発生しません。 realloc
は、将来のmalloc
操作で残りを「使用可能」とマークするだけです。
ただし、後でfree
myPointer
を実行する必要があります。余談ですが、0
はrealloc
のサイズと同じで、free
と同じ効果があります一部の実装では。 Steve JessopとR.がコメントで言ったように、あなたはそれに頼るべきではありません。
確実にメモリリークはありませんが、realloc
を呼び出してサイズを小さくすると、少なくとも3つのことが起こります。
オプション3はやや悪い実装ですが、完全に合法です。後でfree
を呼び出してもすべてが解放されるため、「メモリリーク」はまだありません。
オプション1と2については、パフォーマンスを優先するか、メモリの断片化を回避するかに大きく依存します。私は、ほとんどの実際の実装はオプション1の実行に傾くと思います。
新しいコードは、reallocが失敗した場合でも元の割り当てをリークします。ほとんどの実装ではブロックの縮小に失敗しないと思いますが、それは許可されています。ブロックの拡大または縮小にかかわらず、reallocを呼び出す正しい方法はvoid * tmp = realloc(myPointer、50 * sizeof(int));です。 if(!tmp){/ *どういうわけかエラーを処理します。 myPointerは、まだ割り当てられている古いブロックをまだ指しています* /} myPointer = tmp;。 – 48分前のスティーブジェソップ
こんにちは、コメントへの返信方法がわかりませんでした。
TmpをmyPointerのタイプにキャストする必要がありますか?この場合、私は書く必要がありますか
myPointer = (int*)tmp
また、この場合、free(myPointer)を実行すると、tmpが指すメモリも解放されますよね?だからする必要はありません
free(myPointer)
free(tmp)
あなたがあなたのコードを与えた方法で、はい、それはリークを持っているかもしれません。 realloc
の考え方は、データの新しい場所を返すことができるということです。あなたが質問でそれをするように、realloc
があなたに送るそのポインタを失います。
int *myPointer2 = realloc(myPointer,50*sizeof(int));
assert(myPointer2);
myPointer = myPointer2;