c++ - 实际获得的动态分配内存的大小怎么确定
怪我咯
怪我咯 2017-04-17 14:20:17
0
5
696
怪我咯
怪我咯

走同样的路,发现不同的人生

全員に返信(5)
伊谢尔伦

Zhihu で見たことがあります:

最初に質問させてください。ポインタにはメモリ ブロックのサイズに関する情報がありません。では、解放されるメモリ ブロックのサイズをどうやって知ることができるのでしょうか?したがって、ほとんどのメモリ アロケータでは、malloc によって要求される実際のメモリは、必要なスペースよりも数バイト大きく、メモリの大きさを記録するために追加データがメモリ アロケータに格納され、通常はポインタの左側に直接格納されます。フリーの場合、ポインタ アドレスから定数を引いた後のメモリ ブロックが読み取られ、メモリ ブロック情報が取得されます。したがって、メモリ ブロックの先頭を指していないポインタを解放すると、解放中に他のデータがメモリ ブロック情報として誤って解釈され、(高い確率で) プログラムがクラッシュする原因になります。もちろん、最新のメモリ アロケータは、サイズの異なるメモリ アプリケーションに対して異なる割り当て戦略を採用しますが、戦略に関係なく、malloc からではないポインタを解放することは非常に危険な行為です。

参照: https://www.zhihu.com/questio...

いいねを押す +0
黄舟

要求されたメモリより実際にどれだけ多くのメモリが割り当てられるかは標準では規定されておらず、malloc の実装に依存します。これは開発者が気にする必要はありません。

いいねを押す +0
小葫芦

実際に割り当てられたメモリ サイズを決定します

万能の解決策はありません。これはメモリ アロケータの実装の詳細であるためです。知る必要がある場合は、使用しているメモリ アロケータがどのようにメモリを割り当てるかを確認する必要があります。

いいねを押す +0
大家讲道理

この部分は CSAPP で説明されています。追加のレコード サイズのヘッダーが存在するだけでなく、アライメント操作により要求されたよりも多くのメモリが取得されます。

いいねを押す +0
左手右手慢动作

オペレーティング システムは、各ポインターにどれだけのメモリが割り当てられているかを知る必要があります。delete を呼び出したとき、ポインターが占める領域がどれだけのメモリを占有するかをオペレーティング システムに伝えなかったので、この値が格納される場所が必要です。この値はオペレーティング システムごとに実装が異なります。たとえば、最も単純な実装は、メモリ割り当ての長さを保存するために各ポインタの前にバイトを使用することです。一般に、オペレーティング システムは取得する関数を提供します。実際のメモリ サイズ (malloc_size などの関数)。
ご興味がございましたら、Redis ソース コード zmalloc.h および zmalloc.c をご覧ください
https://github.com/antirez/re...

リーリー

tcmalloc と jemalloc の実装についても学ぶことができます

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート