2013-07-03 45 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