我正在将一些代码移植到Windows并且难倒了。有一些代码在启动时自动运行,以便将指针复制到指针,并在退出时再次运行以删除指向指针的指针(如果它不为空)。指针不指向指针时发生指针崩溃
我创建了一个示例程序来重现行为
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;
}
的类层次结构看起来是这样的。基类是一些带有一些纯虚函数的接口,并且被整个程序中的许多类所包含,使得许多对象可能从多个地方继承它。正因为如此,具体实现必须用“公共虚拟接口类”扩展它。在这个例子中,删除“虚拟”解决了崩溃。
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) {}
};