走同样的路,发现不同的人生
Zhihu で見たことがあります:
最初に質問させてください。ポインタにはメモリ ブロックのサイズに関する情報がありません。では、解放されるメモリ ブロックのサイズをどうやって知ることができるのでしょうか?したがって、ほとんどのメモリ アロケータでは、malloc によって要求される実際のメモリは、必要なスペースよりも数バイト大きく、メモリの大きさを記録するために追加データがメモリ アロケータに格納され、通常はポインタの左側に直接格納されます。フリーの場合、ポインタ アドレスから定数を引いた後のメモリ ブロックが読み取られ、メモリ ブロック情報が取得されます。したがって、メモリ ブロックの先頭を指していないポインタを解放すると、解放中に他のデータがメモリ ブロック情報として誤って解釈され、(高い確率で) プログラムがクラッシュする原因になります。もちろん、最新のメモリ アロケータは、サイズの異なるメモリ アプリケーションに対して異なる割り当て戦略を採用しますが、戦略に関係なく、malloc からではないポインタを解放することは非常に危険な行為です。
参照: https://www.zhihu.com/questio...
要求されたメモリより実際にどれだけ多くのメモリが割り当てられるかは標準では規定されておらず、malloc の実装に依存します。これは開発者が気にする必要はありません。
malloc
実際に割り当てられたメモリ サイズを決定します
万能の解決策はありません。これはメモリ アロケータの実装の詳細であるためです。知る必要がある場合は、使用しているメモリ アロケータがどのようにメモリを割り当てるかを確認する必要があります。
この部分は CSAPP で説明されています。追加のレコード サイズのヘッダーが存在するだけでなく、アライメント操作により要求されたよりも多くのメモリが取得されます。
オペレーティング システムは、各ポインターにどれだけのメモリが割り当てられているかを知る必要があります。delete を呼び出したとき、ポインターが占める領域がどれだけのメモリを占有するかをオペレーティング システムに伝えなかったので、この値が格納される場所が必要です。この値はオペレーティング システムごとに実装が異なります。たとえば、最も単純な実装は、メモリ割り当ての長さを保存するために各ポインタの前にバイトを使用することです。一般に、オペレーティング システムは取得する関数を提供します。実際のメモリ サイズ (malloc_size などの関数)。 ご興味がございましたら、Redis ソース コード zmalloc.h および zmalloc.c をご覧くださいhttps://github.com/antirez/re...
tcmalloc と jemalloc の実装についても学ぶことができます
Zhihu で見たことがあります:
参照: https://www.zhihu.com/questio...
要求されたメモリより実際にどれだけ多くのメモリが割り当てられるかは標準では規定されておらず、
malloc
の実装に依存します。これは開発者が気にする必要はありません。万能の解決策はありません。これはメモリ アロケータの実装の詳細であるためです。知る必要がある場合は、使用しているメモリ アロケータがどのようにメモリを割り当てるかを確認する必要があります。
この部分は CSAPP で説明されています。追加のレコード サイズのヘッダーが存在するだけでなく、アライメント操作により要求されたよりも多くのメモリが取得されます。
オペレーティング システムは、各ポインターにどれだけのメモリが割り当てられているかを知る必要があります。delete を呼び出したとき、ポインターが占める領域がどれだけのメモリを占有するかをオペレーティング システムに伝えなかったので、この値が格納される場所が必要です。この値はオペレーティング システムごとに実装が異なります。たとえば、最も単純な実装は、メモリ割り当ての長さを保存するために各ポインタの前にバイトを使用することです。一般に、オペレーティング システムは取得する関数を提供します。実際のメモリ サイズ (malloc_size などの関数)。
リーリーご興味がございましたら、Redis ソース コード zmalloc.h および zmalloc.c をご覧ください
https://github.com/antirez/re...
tcmalloc と jemalloc の実装についても学ぶことができます