19

realloc リファレンスには次のように書かれています。

この関数はメモリ ブロックを新しい場所に移動する場合があり、その場合は新しい場所が返されます。

これを行うと、次のようになります。

void foo() {

        void* ptr = malloc( 1024 );

        unsigned char* cptr = ( unsigned char* )ptr+256;

        ptr = realloc( ptr, 4096 );
}

realloc がブロックを移動すると、cptr が無効になる可能性がありますか?

はいの場合、realloc は何らかの方法でブロックを移動することを通知するので、cptr が無効になるのを防ぐために何かを行うことができますか?

4

5 に答える 5

8

はい、cptrrealloc がブロックを移動すると無効になります! いいえ、メモリのブロックを移動していることを伝えるための信号については言及されていません。ところで、あなたのコードは不確かに見えます...読んでください...別の質問に対する私の答えを見て、コードがどのように使用されているかを注意深く読んでくださいrealloc。一般的なコンセンサスは、これを行う場合です。

ボイド *ptr = malloc(1024);

/* コードの後半で */

ptr = realloc(ptr, 4096);

/* バン! realloc が失敗した場合、貴重なメモリがいっぱいになります! */

これを回避する方法は、一時ポインターを使用して、次のように使用することです。

ボイド *ptr = malloc(1024);

/* コードの後半で */

void *tmp = realloc(ptr, 4096);

if (tmp != null) ptr = tmp;

編集:これを以前に入力していたときに忍び込んだグレムリンを指摘してくれたSecureに感謝します。

于 2010-01-31T15:15:00.127 に答える
5

これは少し遅れていますが、この問題 (誰も言及していません) の解決策は、割り当てが必要な割り当て済みブロックへのポインターを使用しないことです。代わりに、ベース ポインターからの整数値のオフセットを使用するか、(より良い)struct型とメンバー要素を使用して、割り当てられたオブジェクト内の特定の場所をアドレス指定します。

于 2010-10-05T04:06:35.770 に答える
4

はい、cptrrealloc がブロックを移動すると無効になります。

いいえ、信号はありません。元の場所に対して戻り値を確認する必要がありptrます。

于 2010-01-31T15:07:08.467 に答える
3

はい。

最善の方法は、再割り当ての前後で ptr を比較し、移動されたかどうかを確認することです。オフセット値にポインターを割り当てないでください。代わりに、オフセットを格納してから、元の演算子にインデックスを付ける必要があります。

すなわち

それ以外の void* newPtr = ptr + 10; *newPtr = something;

使用する int new = 10; ptr[new] = something;

于 2010-01-31T15:06:15.427 に答える
2

はい、realloc がブロックを移動すると、cptr は無効になります。

于 2010-01-31T15:07:00.793 に答える