2

友達

私たちの C++ では、現在、realloc メソッドを使用して、malloc によって割り当てられたメモリのサイズを変更しています。realloc() の使用法は以下のように行われます

my_Struct *strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

strPtr = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);

現在ウィキペディア (_http://en.wikipedia.org/wiki/Malloc) は次のように述べています。

代わりに

void *p = malloc(orig_size);

/* and later... */

p = realloc(p, big_size);

big_size バイトのメモリを取得できない場合、p の値は NULL になり、以前に p に割り当てられたメモリへのポインタがなくなり、メモリ リークが発生します。

また、上記のエラーを修正する正しい方法は

void *p = malloc(orig_size);

/* and later... */

void *tmp = realloc(p, big_size); 

if (tmp != NULL)
 {

p = tmp; /* OK, assign new, larger storage to p */

} 

else 

{

/* handle the problem somehow */

}

realloc() を使用する最良の方法を教えてください。

また、構造体へのポインターを取得したら、後でreallocを使用しているときに、voidへのポインターを使用できますか???

どうもありがとう

4

6 に答える 6

7

もちろん、 をrealloc()返すケースから保護する必要がありますNULL。これはメモリ割り当てであり、C (ここでrealloc()) では主に使用されます。C++ プログラマーは、生のrealloc()呼び出しを使用するのは少し低レベル/奇妙だと考えていると思います。メモリ割り当ては常に失敗する可能性があります。

ポインターを戻り値で直接上書きすると、元のポインターが削除され、再割り当てが失敗した場合にメモリ リークが発生するため、エラーになります。

于 2009-03-09T13:04:54.943 に答える
5

Malloc() と realloc() は C 関数です。実際には、realloc() は、渡す引数に応じて malloc() と free() を実行します。

  • null ポインターを渡すと、realloc は malloc と同じように動作します。
  • ゼロ サイズを渡すと、realloc は free と同じことを行います。

ここから引用、より深い説明があります。

C ライブラリでは、メモリ ブロックをその場で拡張することはできないため、C++ でもサポートされていません。

C 関数に固執したい場合は、realloc() を呼び出すときに、最初のメモリ割り当てのポインターを保持する必要があります。次に、最後のコードで行ったのと同じように、それが NULL かどうかを確認し、そうでない場合は割り当てます。

しかし、C++ の場合、最善の解決策は、C の malloc() に基づく std ソリューションである独自の mallocator を作成することです。これ、またはこれをチェックしてください。

于 2009-03-09T13:32:21.537 に答える
1

推奨されるアプローチを使用してください。realloc が正常に戻るまで、前のバッファーへのポインターを保持します。realloc() が正常に返されたら、前のブロックが解放され、それへのすべてのポインターがぶら下がっています – それらを調整します。

realloc と malloc は、ポインターの型が何であるかを気にしません。void* だけでなく、何でも* を使用できます。

于 2009-03-09T13:06:10.307 に答える
0

realloc() が失敗して NULL を返す場合、元のメモリは変更されません。
したがって、次のように使用する必要があります。

my_Struct* strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

my_Struct* tmp = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);
if (tmp != NULL)
{
    strPtr = tmp;
}
else
{
    /* realloc Failed. Need to do something */
}
于 2009-03-09T14:44:15.967 に答える
0

他の人が言ったように、提案どおりに realloc を適切に使用してください。

しかし、これを行う「C++ の方法」は、配列を自分で維持するのではなく、実際には std::vector<> を使用することです。そうすれば、C++ 標準ライブラリが再割り当ての低レベルの詳細を処理します (おそらく realloc() を使用して)。

于 2009-03-09T14:32:06.667 に答える
0

なぜ malloc と realloc を使用しているのですか? ほとんどの場合、C++ にはより良い方法があります。

可変長配列を作成するために使用している場合は、ほぼ確実に std::vector<> を使用するか、他のコンテナー テンプレートのいずれかを使用することをお勧めします。

代わりに C を使用している場合、おそらく C++ 対応のコンパイラを使用している場合、正しい方法は 2 番目の方法です。この方法では、割り当てに失敗してもメモリ ブロック全体が失われません。

2 番目の質問に対する答えは、C と C++ のどちらを使用しているかによっても異なります。C では、void * は汎用データ ポインター型であり、自由に変換できます。C++ では、void * を明示的に変換する必要があります。実際に C を書いている場合は、void * で動作する malloc() とその仲間を使用する必要があります。本当に C++ を書いている場合は、キャストする必要があるため、扱いにくくなります。どちらの場合も、realloc() は構造体へのポインターではなく、void へのポインターに対して機能します。

于 2009-03-09T14:55:56.360 に答える