我在项目中将Loki SingletonHolder与Loki Factory结合使用。以下示例基本上由try-block中的两行代码组成1.)使用工厂2.)然后抛出异常。
#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;
}
在Linux PC(x86)上运行代码我得到“EXCEPTION:test exception”作为输出。
但是,如果我用arm-angstrom-linux-gnueabi-g ++交叉编译代码,然后在BeagleBoard(ARM处理器)上运行该程序,则该程序退出:
ERROR - EXCEPTION: test exception
terminate called after throwing an instance of 'std::logic_error'
what(): Dead Reference Detected
Aborted
我将程序更改为
//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;
}
并以
退出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;
}
编辑2: 通过定义LOKI_FUNCTOR_IS_NOT_A_SMALLOBJECT,问题消失。显然,死引用不是由“我的”Singleton引起的(因为它也发生在不抛出的自定义LifetimePolicy上),而是由Factory使用的SmallObj.h的AllocatorSingleton引起的。然而,问题仍然是为什么这只发生在ARM系统上,以及如何在没有上述定义的情况下避免它。