나는 내가 작업이 코드를 작성 A.'새로운'인스턴스를 생성하면 소멸자 충돌을 해결할 수 있습니까?
전화 할게 클래스의 하위 클래스, B를 생성, 그래서 나는 실제 코드 일반화거야 :
class A
{
public:
A()
{
important_variable = new Type();
...
};
~A (void) { delete(important_variable); }; // Default destructor
// more methods
protected:
Type *important_variable;
};
class B : public A
{
public:
B() : A() { important_variable = another_var; }
~B() {};
Type *another_var;
};
을 B에 대한이 코드를 사용하면 프로그램이 '처리되지 않은 예외'로 인해 충돌을 일으켰습니다. 이제
, 나는 여기에 클래스 B의 코드를 변경할 때 :
class B : public A
{
public:
B() : A() { another_var = new Type(); important_variable = another_var; }
~B() {};
Type *another_var;
};
예외는 사라집니다.
A가 다른 변수가 가리키는 변수를 삭제하려고했기 때문에 B에 대한 원래 코드로 인해 프로그램이 중단되는 것으로 생각합니다. 이 논리가 맞습니까? B에 대한 새 코드가 내 프로그램을 작동시키는 이유는 무엇입니까?
추측이 맞을 수도 있습니다 (더 많은 코드를 보지 않고는 말할 수 없습니다). 두 번째 코드는 각 인스턴스에 대해 새 객체를 만들기 때문에 작동하므로 삭제할 때마다 다른 인스턴스의 발가락을 밟지 않습니다. 하지만 코드에 메모리 누수가 있습니다. 포인터를 사용했던 객체에 대해 무언가를하지 않고 포인터를 재 할당 할 수는 없습니다. – Dave