請注意我的英語水平很低。但我會盡我所能解釋。
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模式。在發佈模式下,不會發生此問題。
請修復您的代碼片段。刪除'
'標籤,突出顯示您的代碼,然後單擊「代碼片段」按鈕(它看起來像一對大括號'{}')或按Ctrl + K **。另外,請確保在每個片段之前和之後留出空白行。 –
Adam Rosenfield /感謝通知{}按鈕。 – user1006322
VS明顯掛起,因爲它的檢測內存泄漏。泄漏不是由保存DWORD的'std :: list'引起的,但它們依賴於'MAX_OBJECT_NUMBER'。那麼,還有誰正在使用'MAX_OBJECT_NUMBER'作爲限制?必須有一些與'm_objAvaliable'相關的對象,它們可能沒有正確釋放,但是如果沒有看到代碼,我們就無法判斷。 – eran