Loki Factory-Singleton выбрасывает «обнаружена мертвая ссылка» в блоке try-catch на ARM - PullRequest
1 голос
/ 28 июля 2011

Я использую Loki SingletonHolder в сочетании с Loki Factory в моем проекте.Следующий пример в основном состоит из двух строк кода в блоке try, чтобы 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 (x86) Iполучить «ИСКЛЮЧЕНИЕ: проверить исключение» в качестве выходных данных.

Однако, если я кросс-компилирую код с помощью 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.Очевидно, что мертвая ссылка вызвана не "моим" синглтоном (потому что это также происходит с пользовательским LifetimePolicy, который не генерирует), а с AllocatorSingleton из SmallObj.h, который используется Factory.Однако остается вопрос, почему это происходит только в системе ARM и как этого можно избежать без определения, указанного выше.

...