Loki Factory-Singleton在ARM上的try-catch-block中抛出“检测到死引用”

时间:2011-07-28 12:09:01

标签: c++ exception gcc singleton factory

我在项目中将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系统上,以及如何在没有上述定义的情况下避免它。

0 个答案:

没有答案