// Non singleton
класс MyLogManager
{
void write (message) {Ogre :: LogManager :: getSingletonPtr () -> logMessage (message);}
}
class Utils : public singleton<Utils>
{
MyLogManager *handle;
MyLogManager& getHandle { return *handle; }
};
namespace someNamespace
{
MyLogManager &Log() { return Utils::get_mutable_instance().getHandle(); }
}
int main()
{
someNamespace::Log().write("Starting game initializating...");
}
В этом коде я использую синглтон boost (из сериализации) и вызываю менеджер журналов Ogre (он тоже синглтонного типа).
Программа терпит неудачу при любой попытке что-то сделать с Ogre :: LogManager :: getSingletonPtr () объект с кодом
User program stopped by signal (SIGSEGV)
Я проверил, что getSingletonPtr () возвращает адрес 0x000
Но использование кода Utils::get_mutable_instance().getHandle().write("foo")
хорошо работает в другой части программы. Что не так может быть с вызовом синглетонов?
Реальная версия класса Utils:
class Utils : public singleton<Utils>
{
protected:
ConfigManager *configHandlePtr;
LogManager *logHandlePtr;
public:
Utils()
{
configHandlePtr = new ConfigManager();
string engineLog = configHandle().getValue<string>("engine.logFilename", "Engine.log");
logHandlePtr = new LogManager(engineLog);
}
~Utils()
{
delete configHandlePtr;
delete logHandlePtr;
}
ConfigManager &configHandle() const { return *configHandlePtr; }
LogManager &logHandle() const { return *logHandlePtr; }
};
А вот и реальный код LogManager класс:
class LogManager
{
protected:
string mDefaultPath;
public:
LogManager(const string &logPath = "Engine.log") :
mDefaultPath(logPath) { }
void write(const string &message, const string logFile = "")
{
string workPath = mDefaultPath;
Ogre::LogManager *logHandle = Ogre::LogManager::getSingletonPtr(); // [logHandle=0x000]
Ogre::Log *log2Handle = logHandle->getLog(workPath); // [SEGFAULT]
log2Handle->logMessage(message);
Ogre::LogManager::getSingletonPtr()->logMessage(message);
}
};
UPDATE:
У меня есть статическая библиотека (есть код моего двигателя) и основная собственная программа, которая связывает статическую библиотеку. Когда я вызываю мой дескриптор конфигурации (который не использует Ogre), все в порядке! Существует также resourceManager , он также использует Ogre. И это терпит неудачу как logManager . Оба этих менеджера используют синглтон Огре. Может быть, это невозможно назвать из другой библиотеки?