4

重複の可能性:
malloc 後にメモリ ブロックの長さを取得する方法は?

ポインタがある場合、によって割り当てられたバイト数を知ることは可能newですか? 私がグーグルで検索したとき、私は Windows:_msize()と Mac:の解決策を見つけましたmalloc_size()。しかし、Linux には何もありません。

そうでない場合、なぜプログラマーから隠されているのか誰か知っていますか? deleteそのような情報は絶対に知っておくべきです。

アップデート:

私の知る限り、このコードがある場合:

 class A {   
   ~A() {}
   int m_a; 
 }; 
 class B : public A {
   ~B() {}
   int m_b; 
 };

 int main() {   A * b = new B();   delete b;   return 0; }

A のデストラクタが呼び出されますが、割り当てられたメモリはすべてnew解放されます。これは、ポインターのみを知っている方法で計算できることを意味します。では、それをプログラマーから隠す理由は何ですか?

4

6 に答える 6

5

残念ながら、およびによって割り当てられたバイト数を取得する移植可能な方法はありません。これにはいくつかの理由があります。newmalloc

  • 一部のプラットフォームではdelete、何もしfreeませ。そのため、サイズ情報を保存する必要はありません。これは組み込みプラットフォームでは驚くほど一般的です。あまり多くの割り当てを行わない限り、他のプラットフォーム用に記述された C または C++ コードを変更せずに使用できます。
  • より一般的なプラットフォームでも、システムは要求したバイト数とは異なるバイト数を割り当てる場合があります。通常、割り当てはより大きなサイズに調整されます。元のリクエストよりもはるかに大きい可能性があります。ストレージ メタデータは、非常に低速なデータ構造に格納されることもあります。タイム クリティカルなコードでロックを取得したり、ハッシュ テーブルにアクセスしたりすることは望ましくありません。

移植可能な言語として、C および C++ は、すべてのプラットフォームで利用できない (または明確に定義されている、またはかなり高速な) 機能を提供することはできません。そのため、これは C++ では使用できません。そうは言っても、これは必要ありません - C++ offers はstd::vector、割り当てのサイズを追跡するか、それらすべての詳細を処理します。std::string

于 2012-09-21T06:04:26.717 に答える
3

newmalloccallocおよび言語の他のすべてのヒープ関連の割り当て (はい、それら以外にも多数あります) は、少なくとも要求した量のメモリを割り当てます。彼らはもっと多くを割り当てるかもしれません(そして、一般的に彼らはもっと多くを割り当てます)。

彼らが割り当てた量を知る移植可能な方法はありません。実際、使用しているヒープ マネージャーを正確に把握していない限り、方法はまったくありません。

また、返されたポインターから安全にアクセスできるメモリの意味で、割り当てられたメモリを区別する必要があります (これは、mac では malloc_size が返し、おそらく Windows では _msize が返すものです)。割り当て (これには、割り当てたメモリ ブロックに隣接している場合と隣接していない場合があり、同じサイズの割り当てでも同じである場合とない場合がある簿記情報が含まれます)。

于 2012-09-21T07:27:15.747 に答える
1

オペレーターが行うnewことは、コンストラクターを呼び出すことです。そのため、割り当てのサイズは、呼び出すコンストラクターのタイプによって異なります。

例えば

class A
{
private:
    int* x;
public:
    A() { x = new int [100]; }
};

割り当てsizeof(int) * 100ますが、Aの実装があなたから隠されているかどうかを知ることはできません。

自分で演奏する場合:

int * x = new int [100];

次に、にアクセスできるために割り当てた金額がわかりますsizeof(primitive)

さらに、deleteオペレーターはデストラクタを呼び出すため、複雑なオブジェクトの場合、メモリを完全かつ正確に解放する責任はプログラマーに完全に委任されるため、割り当てられたメモリのサイズを知る必要はありません。

したがって、ここでは簡単な答えはありません。

于 2012-09-21T05:51:37.233 に答える
1

Q: malloc パッケージにクエリを実行して、割り当てられたブロックの大きさを調べることはできますか?

A: 残念ながら、標準的な方法やポータブルな方法はありません。(一部のコンパイラは非標準の拡張機能を提供します。) 知る必要がある場合は、自分で追跡する必要があります。

C-よくある質問

于 2012-09-21T05:45:57.483 に答える
1

上記の回答に加えて: 状況によっては、割り当ておよび割り当て解除する必要があるサイズがコンパイル時に判明し、サイズをどこかに記録するためにメモリの完全なウエ​​ストになることがあります。

静的型と動的型が等しい場合、解放するメモリは型によって決定できます。

静的タイプが動的タイプと等しくない場合、削除されたオブジェクト クラスには仮想デストラクタが必要です。このデストラクタを使用して、適切なサイズのメモリの割り当てを解除できます。

配列を割り当てる場合、通常、配列のサイズは実装に依存する方法でその配列にアタッチされ、解放されるサイズは要素の型と配列のサイズによって決定できます。

于 2012-09-21T07:42:18.000 に答える
0
 X x=new X()

ここでは、クラスのサイズ、つまりクラスに含まれる変数の数に依存します。

int x = new int [100];

ここでは、割り当てようとしている要素の数によって異なります。たとえば、int は 2 バイト、ここでは 200 バイトが必要です。
簡単に言えば、新しい演算子を使用するデータ型に依存すると言えます

于 2012-09-21T05:59:30.710 に答える