- ベストアンサー
void*型のデータサイズ
すみません教えていただけますか? void*で宣言した変数にmallocで確保して mallocで確保したデーターサイズがわからないクラスで void*型のサイズを取得したいのですが できますか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・Windows の OS なら malloc() 関数の代わりに GlobalAlloc() という API関数を 使ってみたらどうでしょうか。 malloc() 関数も最終的には GlobalAlloc() 関数を呼び出しているようなので。 それで GlobalAlloc() で確保したメモリはあとで GlobalSize() 関数で取得できます。 ・下にそのサンプルを載せておきます。 サンプル: DWORD dwSize; DWORD dwMax; void *ptr; if ( (ptr = (int *)GlobalAlloc(GPTR,(sizeof(int) * 100))) != NULL ){ // 確保したサイズを取得 dwSize = GlobalSize( ptr ); // 確保した配列の要素数を計算 dwMax = (dwSize / sizeof(int)); GlobalFree( ptr ); } その他: ・void *とその確保サイズを表す構造体(クラスでも)を作って独自に管理する方が良いかも。 // 構造体の場合 typedef struct usermem_t { void *buff; size_t size; } usermem_t; // クラスの場合 class CUserMem { void *m_buff; size_t m_size; private: CUserMem(); CUserMem( size_t size ); ~CUserMem(); void *getBuff(); size_t getSize(); }; ↑ こんな感じで管理するとか。 ・以上。参考に。
その他の回答 (4)
- aris-wiz
- ベストアンサー率38% (96/252)
正確に自分がmallocしたサイズを後から知る方法はありません。 VCなどのWindows環境には取得用のAPIもありますが、 DebugモードやReleaseモードでメモリを割り当てる領域のサイズは 最適化され自分が意図しているサイズよりも大きい場合もあります、 したがって正確なサイズを期待しているのならば、そのサイズを知る 方法はありません。(配列として扱う添え字の最大値などで 使用するなどは絶対にしてはいけません。) 既に出ていますとおり、自分でそのサイズを管理するしかありません。
お礼
ありがとうございます >DebugモードやReleaseモードでメモリを割り当てる領域のサイズは 最適化され自分が意図しているサイズよりも大きい場合もあり そんな事もあるんですね 勉強になりました
- jacta
- ベストアンサー率26% (845/3158)
void*のサイズであればsizeof(void*)で得られますが、ポインタの参照先ということであれば原理的に不可能です。 どうしても取得する必要があるなら、参照先の最初辺りにサイズを入れておくか、ポインタとサイズを対にした対応表を作るなどして、別途管理する必要があります。 あと、すでに回答が出ているように、特定の処理系に特化するのであれば、方法がないわけではありません。
お礼
ありがとうございます やっぱりそうですよね
- fatbowler
- ベストアンサー率48% (26/54)
普通にsizeof()で評価すると、ポインタの大きさ(システムによって違うけど 4バイトが多い)を返すだけですね。 グローバル変数なら話は違ってきますが、普通は分からないと思います。 0xFFFFFFFFとか無効値で初期化しておいて、それが何番目に出てくるか数える、 位しか思いつきませんが、何かうまい手があるなら私も参考にしたいですね。
お礼
ありがとうございます やっぱりそうですよね
- MrBan
- ベストアンサー率53% (331/615)
「mallocで確保したサイズ」を後から知りたいということですか? であれば、標準的な方法ではできません。 mallocに渡したサイズを覚えておく必要があります。 処理系によっては、_msize等で取得できるものもありますが、汎用的ではなくなります。 > mallocで確保したデーターサイズがわからないクラスで > void*型のサイズを取得したいのですができますか? この言わんとするところが理解しがたかったのですが、クラスとはC++のクラスですか? # 最初の回答は、クラスはここでは特に関係ないものと解してのものです。 もしも欲しいのが「データサイズ」ではなく「型のサイズ」なのであれば、 # sizeofを使ってください。 # その他の意味であれば補足してください。
お礼
ありがとうございます やっぱりそうですよね
お礼
ありがとうございます 構造体の件、参考になりました。