Pointer-to-Pointer аварийно завершает работу, если Pointer не работает.

Я портирую некоторый код в 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) {}
};
6
задан Winder 17 December 2010 в 21:55
поделиться