Cで動的に割り当てられたメモリのサイズを調べる方法はありますか?
たとえば、
char* p = malloc (100);
に関連付けられているメモリのサイズを調べる方法はありp
ますか?
Cで動的に割り当てられたメモリのサイズを調べる方法はありますか?
たとえば、
char* p = malloc (100);
に関連付けられているメモリのサイズを調べる方法はありp
ますか?
この情報を見つけるための標準的な方法はありません。ただし、一部の実装でmsize
は、これを行うような関数が提供されます。例えば:
ただし、mallocは要求された最小サイズを割り当てるため、実装のmsizeバリアントが実際にオブジェクトのサイズまたはヒープに実際に割り当てられたメモリを返すかどうかを確認する必要があることに注意してください。
Q.では、
malloc
パッケージにクエリを実行して、割り当てられたブロックの大きさを確認できますか?A.残念ながら、標準的な方法や移植可能な方法はありません。(一部のコンパイラは非標準の拡張機能を提供します。)知る必要がある場合は、自分で追跡する必要があります。(質問7.28も参照してください。)
いいえ、C ランタイム ライブラリはそのような機能を提供していません。
一部のライブラリは、この情報を取得できるプラットフォームまたはコンパイラ固有の関数を提供する場合がありますが、通常、この情報を追跡する方法は別の整数変数にあります。
サイズとアドレスを格納するためのタグ付きポインターを作成するために私が見た最良の方法は次のとおりです。すべてのポインター関数は引き続き期待どおりに機能します。
盗まれた場所: https://stackoverflow.com/a/35326444/638848
また、malloc のラッパーを実装して、malloc が返すポインタの前にタグ (割り当てられたサイズやその他のメタ情報など) を自由に追加することもできます。実際、これは、C++ コンパイラがオブジェクトに仮想クラスへの参照をタグ付けする方法です。以下に実際の例を示します。
#include <stdlib.h> #include <stdio.h> void * my_malloc(size_t s) { size_t * ret = malloc(sizeof(size_t) + s); *ret = s; return &ret[1]; } void my_free(void * ptr) { free( (size_t*)ptr - 1); } size_t allocated_size(void * ptr) { return ((size_t*)ptr)[-1]; } int main(int argc, const char ** argv) { int * array = my_malloc(sizeof(int) * 3); printf("%u\n", allocated_size(array)); my_free(array); return 0; }
サイズとポインタを持つ構造体に対するこのメソッドの利点
struct pointer { size_t size; void *p; };
malloc と free 呼び出しを置き換えるだけでよいということです。他のすべてのポインター操作は、リファクタリングを必要としません。
これは実装に依存すると思います。
ヘッダー データ構造を取得した場合は、それをポインターにキャストしてサイズを取得できます。
mallocを使用する場合、サイズを取得できません。
一方、Windowsヒープ関数のようにOS APIを使用してメモリを動的に割り当てる場合は、それを行うことができます。
このコードは、おそらくほとんどの Windows インストールで機能します。
template <class T>
int get_allocated_bytes(T* ptr)
{
return *((int*)ptr-4);
}
template <class T>
int get_allocated_elements(T* ptr)
{
return get_allocated_bytes(ptr)/sizeof(T);
}
これはうまくいくかもしれません.コードを少し更新してください:
void* inc = (void*) (++p)
size=p-inc;
しかし、これは結果として 1 にp
なりchar*
ます。その場合int*
、結果は 4 になります。
割り当ての合計を調べる方法はありません。