
私はLinuxだけを使用していますが、これが何を意味するのか知りたいです。
~からLinuxプログラミングインターフェース:
割り当てられたメモリブロックを使用するか、
memalign()
空きposix_memalign()
容量を使用する必要がありますfree()
。一部のUNIX実装では、実装は割り当てられたメモリブロックを使用し、適切な並べ替えでそのブロック内のアドレスへのポインタを返すため、割り当てられたメモリブロックを介して
free()
呼び出すことはできません。 glibcの実装にはこれらの制限は適用されません。memalign()
memalign()
malloc()
memalign()
からman memalign
:
posix_memalign()
POSIXでは、取得したメモリを解放できる必要がありますfree(3)
。一部のシステムはmemalign()
orを使用して割り当てられたメモリを回収できませんvalloc()
(たとえば、free(3)
取得したポインタのみが渡されますが、malloc(3)
呼び出してから取得した値をソートmemalign()
するため)。malloc(3)
glibc実装を使用すると、これらの関数から取得したメモリを回収できますfree(3)
。
私はメモリの並べ替えについてよく知らず、理解していません。たとえば、取得した値をmemalign()
呼び出してソートします。malloc(3)
」。
ここで何が起こっているのか、何が間違っているのか教えてくれる人はいますかfree()
?
答え1
posix_memalign
名前が示すように、POSIXで定義されているので使用する必要があります。ご質問がある場合は、memalign
以下をご覧ください。Solaris 10 メモリ割り当て機能のマニュアルページ:
free() の引数は、以前に malloc()、calloc()、または realloc() によって割り当てられたブロックへのポインタです。 free()が実行された後、アプリケーションは追加の割り当てにスペースを使用できますが、システムには返されません。アプリケーションが終了したときにのみメモリがシステムに返されます。 ptrがNULLポインタの場合、何も起こりません。 free() に乱数を渡すと、結果は定義されません。
説明には展開へfree()
の言及さえありませんmemalign
。
たとえば、memalign() は malloc(3) を呼び出し、取得した値をソートします。
次の実装は、与えられた説明の例です。
void *memalign(size_t alignment, size_t size)
{
void *mem;
uintptr_t uip_mem, uip_align;
// fail if alignment is smaller than sizeof(void*) or not a power of two
if (alignment < sizeof(void*) || alignment & (alignment - 1)) {
errno = EINVAL;
return NULL;
}
// allocate alignment extra bytes to prevent heap overflow
mem = malloc(size + alignment);
if (mem == NULL)
return NULL;
uip_mem = (uintptr_t) mem;
uip_align = (uintptr_t) alignment;
// align up returned address
return (void*) ((uip_mem + uip_align - 1) & -uip_align);
}
バラよりこのウィキペディアページソートに関する追加情報。以前の実装は、malloc
ソートに従って返されたアドレスと同じアドレスを返すことも、返さないこともあります。返されたアドレスは、呼び出しによって返されたアドレスとまったく同じでない可能性があるため(または他の割り当て関数)、変更されていない値を返すことを期待しているmalloc
ため、安全に渡すことはできません。free
malloc