我知道其他幾個討論過類似問題的線程。另外我知道,必須釋放所有已分配的資源,並且不應有任何內容不明。我問這個問題的原因是看看是否有辦法在課堂上自動檢測內存泄漏。特別是,我試圖實現一種自動化的方式來檢測單元測試中的泄漏,以便該類的未來開發將更加強大。由於我的課程內部使用了其他幾個類以及一些DLL,因此即使不是不可能跟蹤所有這些漏洞,也是很困難的,所以這樣的單元測試可能會有所幫助。如何檢查C++中的類中的內存泄漏?
我在想一些解決方案能夠檢查課堂內存泄漏。假設我的類是類似於這樣:
class MyClass
{
MyClass() { /* Lots of allocations */ }
~MyClass() { /* Lots of deallocations */ }
}
在測試功能,實例化類實例多次 ,每次破壞。同時,檢查任務管理器(在 的Windows至少),看看是否已分配的內存爲您 應用斜坡上升或保持基本平:
TEST(MyClass, MyClass) { int some_big_number = 10000; for (int i=0; i<some_big_number; i++) { MyClass *myC = new MyClass; delete myC; } }
前後實例化和 破壞後分配一些虛擬變量的類實例並檢查這兩個地址是否相同 。事情是這樣的:
TEST(MyClass, MyClass) { int address_1 = 0, address_2 = 0; int *tmp_1 = new int; address_1 = tmp_1; delete tmp_1; MyClass *myC = new MyClass; delete myC; int *tmp_2 = new int; address_2 = tmp_2; delete tmp_2; EXPECT_TRUE(address_1 == address_2); }
我的假設是,如果有內MyClass的沒有內存泄漏和 所有聲稱內存已正確釋放,地址tmp_1和TMP_2的 應該是相同的。我只是不確定內存 分配是如何工作的。
使用插件或程序,如deleaker或Valgrind,但 這可能使我的代碼或測試不利大,我不知道如果 可以在上下文中使用上述反正。
謝謝!
沒有任何擔保tmp_2將得到相同的地址。這是底層分配器的實現相關細節。 – galop1n
http://valgrind.org/ – bosnjak
'我也知道必須釋放所有已分配的資源,並且不應該有任何不明的情況'如何使用自動執行此工作的構造(如容器和智能指針)? – PaulMcKenzie