重複の可能性:
C++: 空のクラスのオブジェクトのサイズは?
クラスにデータ メンバーがなく、メソッドだけがある場合でも、メモリ リークの可能性があります。まず、クラスメソッドはクラスオブジェクトへの参照であり、オブジェクトは割り当て時にアドレスを格納するためにメモリを必要とします。私は正しいですか?
class Empty
{
doA()
{
}
};
重複の可能性:
C++: 空のクラスのオブジェクトのサイズは?
クラスにデータ メンバーがなく、メソッドだけがある場合でも、メモリ リークの可能性があります。まず、クラスメソッドはクラスオブジェクトへの参照であり、オブジェクトは割り当て時にアドレスを格納するためにメモリを必要とします。私は正しいですか?
class Empty
{
doA()
{
}
};
空のクラスでsizeof
も 0 より大きくする必要があるため、クラスは依然としてスペースを占有します。その理由は、一意のオブジェクトには一意のアドレスが必要だからです。メンバー関数 (メソッド) があるかどうかは関係ありません。
したがって、これはリークします:
new Empty; // leaking at least 1 byte
すべてのクラス インスタンスは、空のクラスであってもゼロ以外のサイズを持つことが標準で要求されています。理由については、この回答を参照してください。
以下は標準では必須ではありませんが、私が使用したすべてのコンパイラ (Visual C++、GCC、Clang) に適用されます。
インスタンスはメンバー関数へのアドレスを保存しません。コンパイラは、コンパイル/リンク時にすべてのメンバー関数のアドレスを既に認識しています。float
したがって、100 個のメンバー関数と 1 つのデータ メンバーのみを持つクラスは、sizeof(float)
バイト スペースしか占有しません。
クラスに仮想関数がある場合、そのクラスのすべてのインスタンスには、仮想関数テーブルポインター用のストレージが必要です。
オブジェクトの割り当て方法によって異なります。ほとんどの場合(またはすべての場合)、クラスが空の場合でも、たとえばnew
またはmalloc
同様のメソッドを使用してオブジェクトを割り当てると、失うとメモリリークが発生します。それへのポインタ。しかし、それは実装にも依存します。
これは、オブジェクトのメモリ空間の近くに割り当てられたオブジェクトの情報を格納する方法new
または両方があるためです。malloc
宣言されたクラスをまったく使用しない場合、コンパイラがそれを最適化する可能性があります。したがって、メモリを割り当てたことがないため、メモリリークは発生しません。
クラスにデータ メンバーがなく、メソッドだけがある場合でも、メモリ リークの可能性があります。
はい、その型でメモリ リークが発生する可能性があります。members のない型であっても、どの型でもリークする可能性があります。 sizeof(EmptyClass)
0 になることはありません。参照: http://www.stroustrup.com/#sizeof-empty
仕様から:
最も派生したクラスのサイズはゼロより大きくなければなりません。
メモリ内のオブジェクトには「スペース」が必要です。そのような空のクラスでも、Constructor と CopyConstructor が自動的にスローされます。そのすべてにメモリが必要です。そして、そのメモリを忘れると、正確にバイトdelete
のメモリリークが発生します。sizeof(Empty)
1バイトでも数バイトでも構いません。