2012-06-25 4 views
0

기본 클래스는 A이고 파생 클래스는 B입니다.기본 클래스에 할당 된 포인터를 삭제하는 방법은 무엇입니까?

class A 
{ 
    A(); 
    virtual ~A(); 
    void func1(); 
    virtual void func2(); 
}; 

class B : public A 
{ 
    B(); 
    ~B(); 
    void func2(); 
}; 

int main() 
{ 
    A* lBaseobj = new A (); 

    lBaseobj->func1(); 
    lBaseobj = new B(); 
    lBaseobj->func2(); 

    delete lBaseobj; 
return; 
} 

내 질문은 : 않습니다 delete lBaseobj뿐만 아니라 여부 new A()으로 lBaseobj 객체에 할당 된 메모리를 해제?

답변

1

, 메모리가 유출되지 않습니다 :

std::unique_ptr<A> lBaseobj(new A()); 
// or: auto lBaseobj = std::make_unique<A>(); 
lBaseobj->func1(); 
lBaseobj.reset(new B()); // will delete resources allocated by new A() 
lBaseobj->func2(); 
return 1; // destructor of lBaseobj will delete resources allocated by new B() 
2

없음은, 초기 오브젝트가 파괴되지 않습니다 엄지 손가락의

A* lBaseobj = new A (); 
lBaseobj->func1(); 
delete lBaseobj; // call delete here 
lBaseobj = new B(); 

규칙은 당신이 순종해야합니다 모든 newdelete이 있어야에 대한 모든 new[]delete[]이 있어야합니다.

코드에 2 개의 new이 있지만 1 delete 만 있습니다.

3

"lBaseobj 삭제"는 lBaseobj 개체에 할당 된 메모리를 새 A()로 해제할지 여부를 지정합니다.

NO하고 예에서 YES. A가 삭제되지 않는 아래에서

는 메모리 누수가 :

A::~A() 가상 그대로 아래
... 
lBaseobj->func1(); // where is delete lBaseObj; ?? 
lBaseobj = new B(); 
... 

은 괜찮 : 당신이 스마트 포인터를 사용하는 경우

... 
lBaseobj->func2(); 
delete lBaseobj;