2013-07-03 23 views
0

當打開任務管理器查看內存使用情況時,它將以使用的.3MB內存開始。在將10萬個對象添加到ptr_vector後,使用了2.3MB的內存。在vector上使用.clear()之後,內存將變爲.8-.9MB。內存使用量增加的原因是什麼?使用boost :: ptr_vector導致C++內存泄漏

下面的代碼:

#include <iostream> 
#include <boost/ptr_container/ptr_vector.hpp> 

class T { 
public: 
    static int nObjects; 
    T() { 
     nObjects++; 
    } 
    ~T(){ 
     nObjects--; 
    } 
}; 

int T:: nObjects = 0; 

int main() { 
    boost::ptr_vector<T> vec; 
    char pause; 
    std::cout << "Press any key to continue: "; 
    std::cin >> pause; 

    for(int i=0; i<100000; i++) { 
     vec.push_back(new T); 
    } 

    std::cout << T::nObjects << " objects created." << std::endl; 

    std::cout << "Press any key to continue: "; 
    std::cin >> pause; 

    vec.clear(); 
    std::cout << T::nObjects << std::endl; 

    std::cout << "Press any key to exit: "; 
    std::cin >> pause; 
    return 0; 
} 

感謝您的幫助。

回答

1

還有就是內存的另一大塊,它似乎你忘記了:在vec分配容納指針的空間。

本聲明:

vec.clear(); 

delete d所有你new創建T S,但它並沒有釋放vec本身分配來容納所有這些指針的內存。如果您撥打vec.capacity(),您會看到vec仍有足夠的空間容納至少100000 T*

爲了騰出存儲器,使用交換成語:

boost::ptr_vector<T>().swap(vec); 

這創建了臨時ptr_vector然後取入swap()呼叫vec的內部存儲設備。然後當臨時銷燬在;時,所有的存儲都被釋放。

+0

非常感謝!這佔增加的內存使用量的大部分。額外的一點可能是由於Yohan對內存頁面的回答。 – Erik

2

你不能依靠windows任務管理器來使用內存,至少不是這樣。

可能內存頁保留,以防您需要重新分配內存。

嘗試在for循環中運行什麼(在循環中構建vec +自動銷燬)。
如果它不斷增加,那麼你可能確實存在內存泄漏。

但我懷疑它會,除非你不正確地使用boost :: ptr_vector。

2

從它的外觀來看,你應該使用boost :: ptr_vector。

我建議您使用Windows Perfmon來正確識別您的應用程序內存使用情況。 的說明,請參見this blog如何在Windows 7中使用Perfmon