Aのデストラクタは、その寿命が終了すると実行されます。そのメモリを解放してデストラクタを実行したい場合は、ヒープに割り当てられていた場合は削除する必要があります。スタックに割り当てられた場合、これは自動的に行われます(つまり、スコープから外れたとき。RAIIを参照)。それがクラスのメンバー(ポインターではなく完全なメンバー)である場合、これは包含オブジェクトが破棄されるときに発生します。
class A
{
char *someHeapMemory;
public:
A() : someHeapMemory(new char[1000]) {}
~A() { delete[] someHeapMemory; }
};
class B
{
A* APtr;
public:
B() : APtr(new A()) {}
~B() { delete APtr; }
};
class C
{
A Amember;
public:
C() : Amember() {}
~C() {} // A is freed / destructed automatically.
};
int main()
{
B* BPtr = new B();
delete BPtr; // Calls ~B() which calls ~A()
C *CPtr = new C();
delete CPtr;
B b;
C c;
} // b and c are freed/destructed automatically
上記の例では、すべてのdeleteおよびdelete []が必要です。そして、私がそれを使用しなかった場合、削除は必要ありません(または実際に使用できます)。
auto_ptr
、unique_ptr
およびshared_ptr
等...はるかに簡単に、この寿命管理を行うための素晴らしいです。
class A
{
shared_array<char> someHeapMemory;
public:
A() : someHeapMemory(new char[1000]) {}
~A() { } // someHeapMemory is delete[]d automatically
};
class B
{
shared_ptr<A> APtr;
public:
B() : APtr(new A()) {}
~B() { } // APtr is deleted automatically
};
int main()
{
shared_ptr<B> BPtr = new B();
} // BPtr is deleted automatically