Loki Factory-Singleton выбрасывает "обнаружена мертвая ссылка" в блоке try-catch на ARM
Я использую 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) в качестве вывода я получаю "ИСКЛЮЧЕНИЕ: тестовое исключение".
Однако, если я кросс-компилирую код с помощью 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 и как этого можно избежать без определения, указанного выше.