Я использую 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 и как этого можно избежать без определения, указанного выше.