我實際上面臨着一個巨大的問題:我有一個單身人士班。我的程序是一個多線程的MFC,因此可以從不同的線程調用單例的構造函數。我用一個互斥體包圍了單例實例getter函數,以避免死鎖和多重構造。下面的意思函數的調用在第一次直接失敗。Singleton構造函數失敗C++ - 可能是什麼?
函數看起來象(LOG_MSG宏記錄給定的字符串到我的日誌文件):
MyClass& MyClass::singleton()
{
LOG_MSG("MyClass::singleton -> jump in");
static CMutex oInitMutex;
try
{
CSingleLock oSingleLock((CSyncObject *) &oInitMutex, TRUE);
LOG_MSG("!!! SINGLETON LOCK OKAY !!!");
static MyClass oMyClassInstance;
LOG_MSG("!!! SINGLETON CONSTRUCTION OKAY !!!");
return oMyClassInstance;
}
catch(...)
{
CString excMsg("Unexpected exception by creating MyClass singleton instance!");
LOG_MSG(excMsg);
throw excMsg;
}
}
我已經想通了,該單對象的建設不會失敗(因爲我們得到了「 !!! SINGLETON CONSTRUCTION OKAY !!!「消息)。
日誌輸出說道:
09.04.2013 ;07:14:51:832;"MyClass::singleton -> jump in"
09.04.2013 ;07:14:51:841;"!!! SINGLETON LOCK OKAY !!!"
... (constructor logs => NOTHING unexpected in it!!! everything runs fine, as they must!!!)
09.04.2013 ;07:14:52:125;"!!! SINGLETON CONSTRUCTION OKAY !!!"
09.04.2013 ;07:14:52:170;"Unexpected exception by creating MyClass singleton instance!"
這是什麼意思?什麼時候返回語句拋出異常(s)?請幫我解決這個問題...
它並不一定是導致異常的'return'說法,但'oSingleLock'的破壞目的?您必須在調試器中運行您的程序以獲取更多信息。 – 2013-04-09 06:39:36
靜態對象需要互斥嗎?它不是一個指針,完整的對象是靜態的 – 2013-04-09 06:42:43
那麼,爲什麼你的互斥體在try塊之外?爲這件事情得到了邪惡的計劃? – WhozCraig 2013-04-09 06:42:52