を使用してオブジェクトを作成する場合new
、メモリはすべてのメンバーに割り当てられ、1 つのコンストラクターが呼び出されます (指定したものに応じて)。それを使用して、そこで参照を作成できます。たとえば、次のようになります。
public Foo()
{
m_bar = new Bar(); // Bar* m_bar;
}
ただし、これはオブジェクトのサイズには影響しません。ポインター ( m_bar
)は常にm_bar
4 バイト (32 ビット アーキテクチャーの場合) のメモリを必要とするため、オブジェクトのサイズは約 8 バイトです (コンストラクターへのポインターの場合は少なくとも 4バイト、ポインターの場合は 4 バイト) 1。
正反対はデストラクタで、使用時に呼び出されdelete
ます。これを使用して、すべての参照を解放できます。
public ~Foo()
{
if (m_bar) // If the pointer is not NULL, thus pointing anywhere.
delete m_bar; // Calls destructor of "Bar" and free it's memory.
}
したがってdelete
、 を呼び出すと、デストラクタが呼び出され、オブジェクトが占有するメモリが解放されますが、(ここのように) オブジェクトが参照するメモリが自動的にm_bar
使用されるわけではありません。これらのオブジェクトがデストラクタ内で削除されることに注意する必要があります。delete for を呼び出すのを忘れると、メモリ リークm_bar
と呼ばれるもので終わる可能性があります。
new
andの使用delete
は、可能な限り多くのパフォーマンスが必要なシナリオ (リアルタイム シナリオなど) で有効ですが、通常はスマート ポインターを使用することをお勧めします。
1オブジェクトの実際のサイズについて実際に説明することはできないことに注意してください。コンパイラがそれをどのように変換するかによって異なります。