4

ポインターを解放することについて、一種の理論的な質問があります。

一部の人 (プログラム自体または OS) は、ポインターとそれらの長さを追跡する必要があると思います。なんで?

float* pointer1 = malloc( 100 * sizeof(float) );

例: ここに float ポインターがあります。誰かが私のpointer1配列の長さを教えてもらえますか? 実行時に関数/メソッドを呼び出してそのポインターの長さを取得する方法はありませんか? したがって、プログラム (または OS) は、実行時に実際の長さを知らなくても、ポインターのメモリ部分を解放する方法は次のとおりです。

free(pointer1);

プログラムが解放へのポインタの長さを知っていた場合、なぜその情報を取得できないのか、長さを追跡するために他の方法を使用しているのか. 例えば:

struct floatArray
{
    float* pointer;
    int length;
}

だから、私はこの問題に非常に興味があります。OSがポインターの長さをどのように処理するかを本当に知りたいです。

ありがとう、

言った。

4

4 に答える 4

4

実際、メモリ マネージャーは、割り当てられた各メモリ ブロックに関するメタデータを保持します。これには、ブロックのサイズに加えて情報が含まれている可能性があります。

これを実装する一般的な方法の 1 つは、ユーザー プログラムがブロックを参照するために使用するメモリ アドレスのすぐ下のメモリにメタデータを格納することです。そのため、malloc の呼び出しで address が返さpれ、メタ データにバイトが含まれている場合、メタ データは のアドレスにn格納されます。p-np-1

于 2012-05-05T20:48:43.957 に答える
2

それは通常、直接 OS ではなく、malloc()実装 (OS からより大きなメモリ ブロックを取得するメモリ マネージャー) です。通常、この情報はリンクされたリストに保存されますが、libc を調べて、malloc()この情報が実際にどのように保存されているかを確認することをお勧めします。

指摘したように、実装はコンパイラ/標準 C ライブラリによって異なるため、標準的な方法はありません。

于 2012-05-05T20:48:06.433 に答える
1

OS が要求した正確な長さを追跡するとは限りません。多くの場合、長さはさまざまな内部的な理由で変更 (増加) されるか、アクセスが遅い方法で格納されます。追加情報がエンコードされている場合があります (通常、サイズは 2 の累乗の倍数に調整され、下位ビットはフラグとして使用されます)。一部の malloc 実装 (特に組み込みのもの) はまったく実装されておらずfree()、この情報を保存する必要がありません。

C 言語の設計者は、この種の自由を C ライブラリの実装に許可したかったため、プログラムが malloc されたバッファーのサイズを取得することを許可していません。

于 2012-05-05T20:50:19.630 に答える
1

MSVC または MinGW では、(非標準!) 関数 _msize を使用できます。

float* pointer1 = malloc( 100 * sizeof(float) );
printf("%lu bytes with %lu elements", (unsigned long)_msize(pointer1),(unsigned long)_msize(pointer1)/sizeof*pointer1);
于 2012-05-05T21:01:36.747 に答える