2011-09-11 7 views
3

は)(malloc関数と互換性mremapはmallocで動作しますか?

void * mremap(void *old_address, size_t old_size , size_t new_size, unsigned long flags); 

ですか?

Linuxを使用しているGCC(C++)。

ありがとうございました。

答えて

6

いいえ、そうではありません。 mallocは、ページ境界にアドレスを与える必要はありません(mremapのように)。mallocからのメモリマッピングを混乱させると、mallocを知らないと危険です。代わりにreallocを使用してください。

+0

追加の注意:GLIBCのreallocは可能な限りLinux上で 'mremap'を使います。 – Mat

+0

ほとんどの場合、 'mremap'の唯一の目的は' realloc'を実装することです... –

2

いいえ、以前に割り当てられたメモリがページアライメントされていると、動作する可能性が高くなります。もちろん、malloc関連のコールは、あなたが自分のデータを移動したことを発見したときに気になることがあります。結果には、ヒープの無効化、データの破損、セグメンテーションの障害が含まれます。

+0

実際には一般的な実装では、メモリがページアライメントされているときに 'mremap'が正しく動作する(恐らくmalloc状態を損なわない)確率は**ゼロ**です。 'malloc'がページアライメントされたメモリを返す唯一の方法は、' mmap'を根本的なメカニズム、すなわち単に 'brk'を使う**でない場合です。これは、ブロックがmallocによって返される直前に数バイトの簿記情報が必要で、 'mmap'で得られたページアライメントされたアドレスをオフセットするためです。 –

+0

もちろん、あなたが(1)決して解放しないか、(2) 'mmap'の新しい匿名ページの場合に限り、' malloc'によって実際に割り当てられた範囲の部分範囲を 'mremap'しても大丈夫です移動したページの代わりに –

関連する問題