Я портирую некоторый код в 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) {}
};