11

C または C++ 標準が、 realloc が小さい (ゼロ以外の) サイズで呼び出されたときにポインターが変更されないことを保証するかどうか疑問に思っています。

size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?

基本的に、OS は、大きなメモリ ブロックを解放したので、すべての再割り当てを利用してメモリを最適化し、何らかの方法で ptr2 を移動することを独自に決定できますか?

4

6 に答える 6

17

http://opengroup.org/onlinepubs/007908775/xsh/realloc.html

0 以外のサイズで正常に完了すると、realloc() は (移動された可能性がある) 割り当てられたスペースへのポインターを返します。

いいえ、保証はありません

于 2009-11-15T03:14:28.007 に答える
7

realloc同じ場所、期間が返される保証はありません。

于 2009-11-15T03:16:32.010 に答える
6

を使用reallocすると、後でメモリがどこに保存されるかについて、まったく保証されません。libc のデフォルトの malloc はしぶしぶメモリをコピーするだけなので、実際には問題ないと思います。しかし、それを当てにしないでください。

于 2009-11-15T03:13:40.343 に答える
4

reallocブロックが収まる場合でも、ブロックをそのままにしておく必要はありません。実際、最も単純なスタブの実装は、そうでない可能性がある例です。

  • malloc: 呼び出しますsbrk
  • realloc: 呼び出しmallocますmemcpy
  • free: ノーオペレーション。

これはばかげているように聞こえるかもしれませんが、組み込みシステムでは、今説明したような実装が実際に最適な場合があります。

于 2010-09-22T05:03:23.313 に答える
0

Windows では、C ランタイムがヒープを取得し、そのヒープからメモリを割り当てます。そのため、OS は個々のメモリ割り当てについて認識しないため、物事を動かしません。

于 2009-11-15T03:15:08.703 に答える