gpt4 book ai didi

c++ - Loki::Factory 在程序退出时抛出异常

转载 作者:行者123 更新时间:2023-11-28 07:27:05 26 4
gpt4 key购买 nike

我正在尝试在使用 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 文件“memory”中找到。异常是访问冲突,堆栈以:

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++

我在互联网上找不到任何关于使用 Loki 的 std::auto_ptr 的引用。

如何解决这个问题?

最佳答案

因为我一直想看看 Loki 库,所以我利用了这个机会。好吧,首先,问题与 MSVC 版本无关,我确实在 VS2008 上运行了相同的示例,并且使用 VS2008 构建的 Loki 库得到了相同的结果。第二:

#include "stdafx.h"
#include <loki/Factory.h>
#pragma comment(lib, "loki_D.lib")
struct Base{};


struct Derived : public Base{};
Base* buildDerived(){
return new Derived();
}

int _tmain(int argc, _TCHAR* argv[])
{
Loki::Factory< Base, int> factory;
bool registeredD = factory.Register(1, buildDerived);
//system("pause");
return 0;
}

这很好用。我检查了你的例子中的崩溃,似乎工厂正在删除你创建的仿函数在它被销毁后应该位于的关联容器。在我看来,这是因为 Loki 正在连接 atexit() 并在那里删除了一些东西(不知道为什么,我想是为了处理 Singleton 对象),这就是你的 Functor 被删除的地方,然后您的工厂的析构函数被调用,然后对关联容器的 erase 调用失败。好吧 - 如果这不是什么大不了的事,请不要让工厂成为全局对象。如果这是一笔大交易,请尝试调试并找出 Loki 为什么要执行它在 atexit 中所做的事情,也许您需要设置更多内容。但至少据我所知,这是另一个破坏全局对象的未定义行为的糟糕案例。

编辑:Loki Factory-Singleton throws "dead reference detected" in try-catch-block on ARM ,宏 LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT 可能是相关的,因为我猜这会触发破坏,也许没有这个对象将不会进入 atexit 中破坏的对象列表,但我对 Loki 库的了解仍然不是够好了。也许您需要定义单例的生命周期策略或类似的东西。

关于c++ - Loki::Factory 在程序退出时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18567969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com