J'essaie d'utiliser Loki::Factory
dans un projet qui est compilé avec VC8 (je ne suis pas autorisé à passer à un compilateur plus récent). Je vais avoir un problème lorsque le programme se termine, que je peux reproduis avec ce code de base (ce qui est le moins vous pouvez obtenir lors de l'utilisation d'une usine)Loki :: Factory lançant une exception à la sortie du programme
#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;
}
tout va bien jusqu'au moment où le système arrive à une pause demandant l'utilisation d'appuyer sur une touche (comme pour system("pause")
); quand j'appuie sur la touche, cependant, le programme avorte, en raison d'une exception non gérée, lancée à partir de la fonction
~auto_ptr()
{ // destroy the object
delete (_Ty *)_Myptr;
}
qui se trouve dans le fichier visual studio « mémoire ». L'exception est une violation d'accès et la pile commence par:
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++
Je ne pouvais trouver aucune référence à l'utilisation de std::auto_ptr
de Loki sur Internet.
Comment le problème peut-il être résolu?
Voyez-vous la callstack dans votre débogueur, forme où le '~ auto_ptr' est appelé? Quelle exception est lancée? –
Essayez d'ajouter un destructeur virtuel à la classe de base. – user1837009
@ user1837009 L'ajout du destructeur virtuel n'aide pas. Bien sûr, vous avez raison, ça devrait l'être. Je ne l'ai pas rendu virtuel dans l'exemple –