私はいくつかのコードをWindowsに移植しており、困惑しています。ポインターへのポインターをコピーするために起動時に自動的に実行されるいくつかのコードがあり、それがヌルでない場合にポインターへのポインターを削除するためにexitで再度実行されるコードがあります。ポインタがポインタにない場合のポインタへのポインタの衝突
私は
動作を再現するために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) {}
};