2011-10-21 106 views
0

請注意我的英語水平很低。但我會盡我所能解釋。
VC2008 C++內存泄漏


我在Visual Studio 2008 sp1中製作了一個mfc項目。

該項目包括,到2008年/ SP1 /原生C++

問題maked靜態庫是步:

1)建立和MFC項目開始調試
2)單擊X按鈕在主窗口或alt + f4退出程序
3)主窗口一次關閉
4)但是當我查看taskmgr的進程選項卡時,它仍然活着。
5)如果我嘗試殺死taskfr上的mfc項目進程,它立即死亡
6)但visual studio仍在調試模式,並且很長一段時間花在IDE上正常返回。
7)時間爲5〜10分鐘
8)輸出日誌,檢測到內存泄漏!!
9)日誌是非常大的,幾乎11megabytes文本


,我發現這一點。
1)靜態庫始終在啓動時創建一個圖書館的主要功能類的實例,使用new運算符(開機是靜態時的主力,前)
2)靜態庫的構造函數有一個代碼
注意:對不起,我試圖在這個編輯器中查看'代碼'選項卡,但是我不能編寫代碼部分,所以我編寫了代碼並訂購了「br」html標籤。


VPHYSICS::VPHYSICS(){ 
     m_tickflowed = 0; 
     QueryPerformanceFrequency(&cpu_freq); 
     SetTickTime(30); 

     m_state[VPHYSTATE_SPEED_MAX]=SPEED_SCALAR_MAX; 
     m_state[VPHYSTATE_LIMITED_ACCELARATION]=FALSE; 
     m_state[VPHYSTATE_FRICTIONENABLE]=TRUE; 
     m_state[VPHYSTATE_FRICTIONFACTOR]=1.0f; 
     m_state[VPHYSTATE_GRAVITY]=9.8065f; 
     m_state[VPHYSTATE_ENGINESPEED_DELAY_HIGH]=0.0f; 
     m_state[VPHYSTATE_ENGINESPEED_DELAY_LOW]=0.0f; 
     m_state[VPHYSTATE_FRICTION_RATIO]=1.0f; 
     m_state[VPHYSTATE_DIMENSION_GLOBAL]=2; 
     m_state[VPHYSTATE_COLLISION_UNFRICTIONABLE]=TRUE; 
     m_state[VPHYSTATE_PAULI_EXCLUSION_ENABLE]=TRUE; 
     m_state[VPHYSTATE_PAULI_EXCLUSION_RATIO]=1.0f; 
     m_state[VPHYSTATE_FRICTION_SMOOTHLY]=1.0f; 
     m_state[VPHYSTATE_COLLHANDLER_OUTER]=TRUE; 
     m_dwSuspendedCount=0; 
     InitializeCriticalSection(&m_criRegister); 
     InitializeCriticalSection(&cri_out); 
     ZeroMemory(m_objs,sizeof(m_objs)); 
     m_bThreadDestroy=FALSE; 
     m_hPhysicalHandle=0; 
     m_nPhysicalThread1ID=0; 
     m_nTimeMomentTotalCount=0; 
     m_hGarbageCollector=0; 
     m_nGarbageCollectorID=0; 
     m_PhyProcessIterID=NULL; 
     for(DWORD i = 1 ; i < MAX_OBJECT_NUMBER ; i++) 
     { 
      m_objAvaliable.push_back(i); 
     } 
    } 

//這個代碼是我的靜態庫,使用遊戲的物理引擎。

並且問題在於何時銷燬這個instace。
當刪除操作符調用(在程序結束時),它需要很長時間。
當我除去

for(DWORD i = 1 ; i < MAX_OBJECT_NUMBER ; i++) 
    { 
     m_objAvaliable.push_back(i); 
    } 

,或者減少MAX_OBJECT_NUMBER(最初是的#define MAX_OBJECT_NUMBER 100000,但我它減少到5或10)中, '時間長' 消失!!

'm_objAvaliable' 的類型是的std ::列表<DWORD>
這個成員變量似乎不會造成內存泄漏。 (因爲這個容器沒有堆分配的任何關係)
和包括這個庫的其他項目沒有這個問題。
(但包括由mfc項目是第一次,我可以看到在這種情況下只有這個問題)
有沒有人想象一個解決方案的問題?
如果您想了解更多信息,請對本文發表評論。我會盡快答覆
更多:它只發生在DEBUG模式。在發佈模式下,不會發生此問題。

+1

請修復您的代碼片段。刪除'
'標籤,突出顯示您的代碼,然後單擊「代碼片段」按鈕(它看起來像一對大括號'{}')或按Ctrl + K **。另外,請確保在每個片段之前和之後留出空白行。 –

+0

Adam Rosenfield /感謝通知{}按鈕。 – user1006322

+0

VS明顯掛起,因爲它的檢測內存泄漏。泄漏不是由保存DWORD的'std :: list'引起的,但它們依賴於'MAX_OBJECT_NUMBER'。那麼,還有誰正在使用'MAX_OBJECT_NUMBER'作爲限制?必須有一些與'm_objAvaliable'相關的對象,它們可能沒有正確釋放,但是如果沒有看到代碼,我們就無法判斷。 – eran

回答

0

我相信您遇到的問題實際上不是問題。 MFC使用它自己的調試版本new(在發佈模式下,它使用常規的默認值new)。 MFC會這樣做,因此它可以嘗試並有助於告訴您存在內存泄漏。

問題是,我認爲你釋放靜態庫中的對象正在發生 MFC已決定轉儲任何它認爲未被正確釋放的分配。鑑於你有這麼多的東西,它花了很長時間把這些東西扔到控制檯上。

在一天結束時,MFC認爲有沒有內存泄漏。

你的解決方案是:

  1. 停止使用MFC DEBUG NEW。刪除您的MFC項目中的所有行是#define new DEBUG_NEW。這種方法的缺點是,當然,如果你無意中造成真正的內存泄漏,它不能跟蹤它們。

  2. 在靜態庫中有一些初始化,反初始化函數。在MFC應用程序退出之前調用取消初始化函數,此時MFC開始拖動它仍然認爲存在的分配。

+0

謝謝。我認爲第二個解決方案是非常好的答案,但是圖書館的重新分配是非常複雜的,我嘗試着1.非常感謝 – user1006322