2

重複の可能性:
C++: 空のクラスのオブジェクトのサイズは?

クラスにデータ メンバーがなく、メソッドだけがある場合でも、メモリ リークの可能性があります。まず、クラスメソッドはクラスオブジェクトへの参照であり、オブジェクトは割り当て時にアドレスを格納するためにメモリを必要とします。私は正しいですか?

class Empty
{
  doA()
  {
  }
};
4

5 に答える 5

2

空のクラスでsizeofも 0 より大きくする必要があるため、クラスは依然としてスペースを占有します。その理由は、一意のオブジェクトには一意のアドレスが必要だからです。メンバー関数 (メソッド) があるかどうかは関係ありません。

したがって、これはリークします:

new Empty; // leaking at least 1 byte
于 2012-11-04T02:47:40.553 に答える
1

すべてのクラス インスタンスは、空のクラスであってもゼロ以外のサイズを持つことが標準で要求されています。理由については、この回答を参照してください。

以下は標準では必須ではありませんが、私が使用したすべてのコンパイラ (Visual C++、GCC、Clang) に適用されます。

インスタンスはメンバー関数へのアドレスを保存しません。コンパイラは、コンパイル/リンク時にすべてのメンバー関数のアドレスを既に認識しています。floatしたがって、100 個のメンバー関数と 1 つのデータ メンバーのみを持つクラスは、sizeof(float)バイト スペースしか占有しません。

クラスに仮想関数がある場合、そのクラスのすべてのインスタンスには、仮想関数テーブルポインター用のストレージが必要です。

于 2012-11-04T02:49:44.220 に答える
0

オブジェクトの割り当て方法によって異なります。ほとんどの場合(またはすべての場合)、クラスが空の場合でも、たとえばnew またはmalloc同様のメソッドを使用してオブジェクトを割り当てると、失うとメモリリークが発生します。それへのポインタ。しかし、それは実装にも依存します。

これは、オブジェクトのメモリ空間の近くに割り当てられたオブジェクトの情報を格納する方法newまたは両方があるためです。malloc

宣言されたクラスをまったく使用しない場合、コンパイラがそれを最適化する可能性があります。したがって、メモリを割り当てたことがないため、メモリリークは発生しません。

于 2012-11-04T02:49:57.103 に答える
0

クラスにデータ メンバーがなく、メソッドだけがある場合でも、メモリ リークの可能性があります。

はい、その型でメモリ リークが発生する可能性があります。members のない型であっても、どの型でもリークする可能性があります。 sizeof(EmptyClass)0 になることはありません。参照: http://www.stroustrup.com/#sizeof-empty

仕様から:

最も派生したクラスのサイズはゼロより大きくなければなりません。

于 2012-11-04T02:45:15.190 に答える
0

メモリ内のオブジェクトには「スペース」が必要です。そのような空のクラスでも、Constructor と CopyConstructor が自動的にスローされます。そのすべてにメモリが必要です。そして、そのメモリを忘れると、正確にバイトdeleteのメモリリークが発生します。sizeof(Empty)1バイトでも数バイトでも構いません。

于 2012-11-04T02:49:44.640 に答える