經過boost的單元測試後,發現程序竟然存在嚴重的內存泄露,總共有60多M。但是經過好多次認真排除還是毫無頭緒。
無意間發現編譯器有一個警告(因爲源代碼量比較多,警告有100多個,所以我編譯時直接就忽略警告了),**no destructor。我於是驚疑起來,定位到文件後,發現我犯了一個比較隱祕的錯誤。
比如我在A.h頭文件中定義了這樣一個函數A。B是實現類。爲了使得編譯依賴最小,我只是聲明瞭B。於是頭文件如下:
//================A.h
class B;
class A
{
~A()
{
delete B;
}
B *impl;
};
//==================
原來這樣會造成A析構時,不能調用B的析構函數,因爲A不知道B的實現類。所以內存泄露由此產生了。嗨,boost真是好東西,下次學學怎麼對內存泄露的位置進行定位。
補充:內存泄露
int main()
{
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
...
Gdiplus::GdiplusShutdown(gdiplusToken);
}
但是由於銷燬Graphics對象是在main函數體結束時才進行的,由於gaphics被shutdown了,因此導致錯誤。之前沒有在析構函數裏未刪除它,因此導致了4個byte的內存泄露!