수명이 끝나면 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
위의 예에서 모든 삭제 및 삭제 []가 필요합니다. 그리고 내가 그것을 사용하지 않은 곳에서는 삭제가 필요하지 않습니다 (또는 실제로 사용할 수 있습니다).
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