Я пытаюсь использовать Loki::Factory
в проекте, который скомпилирован с VC8 (мне не разрешено переключаться на новый компилятор). У меня возникли проблемы при выходе из программы, которые я могу воспроизвести с этим базовым кодом (который является по крайней мере вы можете достичь при использовании завода)Loki :: Factory бросает исключение на выход программы
#include "stdafx.h"
#include <loki/Factory.h>
struct Base{};
Loki::Factory< Base, int> factory;
struct Derived : public Base{};
Base* buildDerived(){
return new Derived();
}
namespace {
bool registeredD = factory.Register(1, buildDerived);
}
int _tmain(int argc, _TCHAR* argv[])
{
system("pause");
return 0;
}
все нормально до того, когда система переходит к паузе с просьбой использовать клавишу нажатием (как для system("pause")
); При нажатии клавиши, однако, программа будет прервана из-за необработанное исключение, брошенное из функции
~auto_ptr()
{ // destroy the object
delete (_Ty *)_Myptr;
}
, который можно найти в Visual Studio файл «память». Исключением является нарушение прав доступа и стек начинается с:
compmgr.dll!std::auto_ptr<Loki::FunctorImpl<Interface2D::IElement *,Loki::NullType,Loki::SingleThreaded> >::~auto_ptr<Loki::FunctorImpl<Interface2D::IElement *,Loki::NullType,Loki::SingleThreaded> >() Riga 718 + 0x32 byte C++
compmgr.dll!Loki::Functor<Interface2D::IElement *,Loki::NullType,Loki::SingleThreaded>::~Functor<Interface2D::IElement *,Loki::NullType,Loki::SingleThreaded>() + 0x2b byte C++
Я не смог найти каких-либо ссылок на использование std::auto_ptr
от Локи в Интернете.
Как решить эту проблему?
Вы видите столбец в своем отладчике, где вызывается '~ auto_ptr'? Какое исключение выбрано? –
Попробуйте добавить виртуальный деструктор в базовый класс. – user1837009
@ user1837009 Добавление виртуального деструктора не помогает. Конечно, вы правы, так и должно быть. Я просто не сделал его виртуальным в примере –