일부 코드가 Windows로 이식되고 난처한 상태입니다. 포인터를 포인터에 복사하기 위해 실행시 자동으로 실행되는 일부 코드가 있으며, 포인터가 null이 아닌 경우 포인터를 포인터로 삭제하기 위해 종료시 다시 실행되는 코드가 있습니다.포인터가없는 경우 포인터에서 포인터로 충돌이 발생합니다.
나는 동작 더 클래스 계층 구조는 다음과 같습니다
int main()
{
// Pointer to a Pointer, current crash.
InterfaceClass** ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = (InterfaceClass**)(&object); // cast is required for some reason.
delete *ptrptr; // Crash here.
// Single pointer, works fine.
InterfaceClass* ptrptr;
ConcreteTwo* object = new ConcreteTwo();
ptrptr = object;
delete ptrptr;
// There are other cases where there are only 3 classes in the hierarchy.
// This also works fine.
InterfaceClass** ptrptr;
ConcreteOne* object = new ConcreteOne();
ptrptr = (InterfaceClass**)(&object);
delete *ptrptr;
return 0;
}
을 재현하는 샘플 프로그램을 만들었습니다. 기본 클래스는 일부 순수 가상 함수가있는 인터페이스이며 많은 객체가 둘 이상의 위치에서 잠재적으로 상속받을 수있는 방식으로 프로그램 전체에 여러 클래스에 포함됩니다. 이 때문에 구체적인 구현은 "public virtual InterfaceClass"로 확장해야합니다. 이 예에서 "가상"을 삭제하면 충돌이 해결됩니다.
class InterfaceClass {
public:
virtual ~InterfaceClass() {};
InterfaceClass() {}
};
class ConcreteClass : public virtual InterfaceClass {
public:
ConcreteClass() { }
virtual ~ConcreteClass() {}
};
class ConcreteOne : public ConcreteClass
{
public:
ConcreteOne(void) {}
virtual ~ConcreteOne(void) {}
};
class ConcreteTwo : public ConcreteOne
{
public:
ConcreteTwo(void) {}
virtual ~ConcreteTwo(void) {}
};