C++ Loki Factory Singleton在手臂上的try-catch块中抛出“检测到死引用”
我在我的项目中使用了Loki SingletonHolder和Loki Factory。下面的示例基本上由try块中的两行代码组成。使用工厂2。然后抛出一个异常C++ Loki Factory Singleton在手臂上的try-catch块中抛出“检测到死引用”,c++,exception,gcc,singleton,factory,C++,Exception,Gcc,Singleton,Factory,我在我的项目中使用了Loki SingletonHolder和Loki Factory。下面的示例基本上由try块中的两行代码组成。使用工厂2。然后抛出一个异常 #include <iostream> #include <loki/Singleton.h> #include <loki/Factory.h> class AbstractBase {}; class ConcreteChild : public AbstractBase {}; class
#include <iostream>
#include <loki/Singleton.h>
#include <loki/Factory.h>
class AbstractBase {};
class ConcreteChild : public AbstractBase {};
class TestFactory: public Loki::SingletonHolder< Loki::Factory<AbstractBase, std::string> >
{};
template <class T>
T* createNew()
{
return new T();
}
int main(int argc, char *argv[])
{
try
{
TestFactory::Instance().Register("ConcreteChild", createNew<ConcreteChild >);
throw std::runtime_error("test exception");
}
catch (std::exception& e)
{
std::cout << "EXCEPTION: " << e.what();
return -1;
}
return 0;
}
我把节目改成了
//same as above, only different main():
int main(int argc, char *argv[])
{
TestFactory::Instance().Register("ConcreteChild", createNew<ConcreteChild >);
throw std::runtime_error("test exception");
return 0;
}
所以这里似乎没有死的参照物
关于如何调试这个问题,你有什么提示吗?或者知道是什么导致了这种行为
非常感谢
编辑:即使我没有抛出异常,问题也会发生
int main(int argc, char *argv[])
{
try
{
TestFactory::Instance().Register("ConcreteChild", createNew<ConcreteChild >);
}
catch (std::exception& e)
{
std::cout << "EXCEPTION: " << e.what());
return -1;
}
return 0;
}
编辑2:
通过定义LOKI_函子_不是一个小对象,问题就消失了。显然,dead引用不是由我的Singleton引起的,因为它也发生在一个自定义的lifetime策略中,该策略不抛出,而是由工厂使用的SmallObj.h的分配器Singleton引起的。然而,问题仍然是,为什么这种情况只发生在ARM系统上,以及在没有上述定义的情况下如何避免这种情况。因此,我猜洛基是引发逻辑错误的原因。坦率地说,这里似乎存在交叉编译器问题。我会尝试在Loki中找到抛出异常的位置。据我所知,它是在的第819行中抛出的。遗憾的是,我无法在ARM设备上调试以了解到底发生了什么。很有趣。销毁只在841行设置为真。有两件事:你是带来洛基图书馆的那个人吗?你确定Singleton.h和sourceforge上的一模一样吗?。第二件事:使用-E选项并将标准输出重定向到文件-E>something.cpp,而不是生成可执行文件-o something。这将为您提供预处理的源代码。模板将不会展开,但如果发生某些Widged宏重新定义,您将能够看到它。我想得越多,这似乎就越可能是你的问题。
terminate called after throwing an instance of 'std::runtime_error'
what(): test exception
Aborted
int main(int argc, char *argv[])
{
try
{
TestFactory::Instance().Register("ConcreteChild", createNew<ConcreteChild >);
}
catch (std::exception& e)
{
std::cout << "EXCEPTION: " << e.what());
return -1;
}
return 0;
}