2015-11-08 46 views
1

我正面臨Release版本的問題。應用程序可以在Debug版本中正常工作,但是在發佈版本中,初始化一個指向另一個類的對象的指針會獲得不同的地址分配,從而導致其值受損。應用程序(mfc)由於編譯器優化而在發佈版本中失敗,但在調試版本中正常工作

My main application class is K32App 
code in K32App.h file 
CSheetPrintManager* m_pSheetPrintManager; 
CSheetPrintManager* GetSheetPrintManager() { return m_pSheetPrintManager; } 

In file K32App.cpp 
K32App::K32App() 
{ 
    m_pSheetPrintManager= NULL; 
} 
BOOL K32App::InitInstance() 
{ 
    if(!m_pSheetPrintManager) 
    m_pSheetPrintManager= new CSheetPrintManager(); 
} 
K32App::~K32App() 
{ 
    if(m_pSheetPrintManager) 
    delete(m_pSheetPrintManager) 
} 


In my file CSheetPrintManager.cpp 
void CSheetPrintManager::CSheetPrintManager() 
{ 
    //Initialized all member variables to default values. 
    Init(); 

} 
void CSheetPrintManager::Init() 
{ 
    m_nSheetType = SheetIllegalNone; //long 
    m_sBankEntry.Empty();   //CString 
    m_bHistorical = FALSE;  //BOOL 
    m_bDebitDetailsSet = FALSE; //BOOL 
    m_mapRequested.RemoveAll(); // Type CMap<long,long,CString,CString&> 
} 

在應用程序啓動時,當它達到

if(!m_pSheetPrintManager) 
    CSheetPrintManager= new CSheetPrintManager(); 

並嘗試建立m_pSheetPrintManager的對象,「這個」裏面的指針CSheetPrintManager.cpp表示在就在花斷點有效地址(0x03768ce0)括號{,一旦我進一步進入CSheetPrintManager.Init(),'這'得到不同的位置,並開始指向另一個地址(0x0000000),然後進一步移動它開始指向另一個位置(0x03786ce0),然後到達m_mapRequested.RemoveAll(); '這'指向其他位置。 返回到主應用程序文件C32App.cpp,我得到以下'm_pSheetPrintManager'CXX0030'自動'窗口中無法評估'表達式'錯誤' 和應用程序繼續運行查看鼠標懸停在m_pSheetPrintManager(無法發佈圖像,因爲需要10聲譽吧:)所以將它鏈接) studio Auto window screenshot

在調試模式下,我得到m_pSheetPrintManager所有的應用處理過程中指向相同的位置和成員始終保持正確的初始化。

但在發佈模式, m_pSheetPrintManager繼續指向(自動窗口中顯示的地址值)不同的位置以及類CSheetPrintManag的所有成員變量呃顯示不同的垃圾(未初始化)值與CSheetPrintManager類內的每一行處理。

如果我在發佈模式中禁用C++編譯器優化,那麼它工作正常,沒有任何問題。

任何幫助/指導/建議是非常感謝。 在此先感謝。 PS:這是我在這裏的第一個問題,所以請原諒,以免遺漏某些東西指向或正確表達。

+1

在檢查優化代碼時,您在* Autos *窗口中看到的內容幾乎沒有用處。您有兩種選擇:單步執行彙編代碼,或切換到Visual Studio 2013或更高版本,並啓用[/ Zo(增強優化調試)](https://msdn.microsoft.com/en-us/library/vstudio /dn785163.aspx)編譯器選項。 – IInspectable

+0

@IInspectable這是遺留代碼,目前我正在使用studio 2005。我會嘗試將其移植到2013年,但不能說它會編譯所有依賴項。 – Param

回答

0

您需要提供更多信息:CSheetPrintManager是否包含在一個dll中?宣言看起來如何?這種方式我只能玩猜謎遊戲...: -/

考慮從CObject派生並使用DECLARE DYNCREATE and IMPLEMENT_DYNCREATE爲您的CSheetPrintManager類。然後,您可以在發佈版本中使用VERIFY(),前提是它是使用CObject::IsKindOf()的有效對象。

嘗試使用#pragma pack()來定義如何在類中完成填充,特別是如果您在發佈版本中對大小進行了優化並且具有混合的調試版和發行版dll。

相關問題