Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Loki Factory Singleton在手臂上的try-catch块中抛出“检测到死引用”_C++_Exception_Gcc_Singleton_Factory - Fatal编程技术网

C++ Loki Factory Singleton在手臂上的try-catch块中抛出“检测到死引用”

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

我在我的项目中使用了Loki SingletonHolder和Loki Factory。下面的示例基本上由try块中的两行代码组成。使用工厂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;
}
我把节目改成了

//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;
}