2013-10-03 71 views
3

例如,以下泄漏?是不是std:映射析構函數調用關鍵析構函數以及值析構函數?

Foo () 
{ 
    std:map<std:string, int> myMap; 
    myMap[std::string("Bar")] = 2983; 
} 

我相信它不會泄漏,但在這一點上找不到具體的文檔。

+0

是的,它不破壞兩個鍵和值。 – Sneftel

+0

有關參考資料,請參見C++ 11標準中的[container.requirements.general]第3節。 – Sneftel

+0

// @本,謝謝,段號是多少? – ThomasMcLeod

回答

4

是的,地圖析構函數map::~map()將調用析構函數,以查找其管理的每個鍵和值並釋放內存。

§23.2.1 表96 - 集裝箱需求(續)

(&a)->X() void 
the destructor is applied to every element of a; all the memory is deallocated. 
+0

元素是'std :: pair'。因此,破壞'std :: pair'會破壞'first'和'second'? – ThomasMcLeod

+0

是的,它就像正常銷燬一對鍵/值,鍵/值的析構函數會相應調用。如果任何鍵/值沒有被銷燬並且內存被釋放,它應該導致資源泄漏。 – billz

0

您不使用new動態分配任何內存。所有變量都分配在堆棧上。我看不到任何內存泄漏。

+2

'std :: string'在堆上分配內存,並且其析構函數取消分配它。 – delnan

+2

地圖中的元素當然是在免費商店中分配的,而不是在堆棧上分配的。否則,他們的一生將會......有問題。 –

+1

@JohnZwinck生命週期不是問題,它可以通過值存儲在地圖中。對集合中元素數目沒有限制的事實是爲什麼它動態分配。 – delnan

2

是的,它當然可以。這在C++中是非常標準的東西,基本上標準庫和STL中的所有東西都是這樣工作的 - 除非你存儲原始指針,否則始終調用析構函數。