C ++使用boost :: ptr_vector泄漏内存

时间:2013-07-03 14:40:28

标签: c++ memory boost memory-leaks ptr-vector

当打开任务管理器以查看内存使用情况时,它将以.3MB内存开始使用。向ptr_vector添加100,000个对象后,使用了2.3MB的内存。在向量上使用.clear()后,内存变为.8-.9MB。内存使用量增加的原因是什么?

以下是代码:

#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;
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您不能依赖Windows任务管理器来使用内存,至少不是那样。

可能会保留内存页面,以防您需要再次分配内存。

尝试在for循环中运行main中的内容(在循环中构建vec +自动销毁)。
如果它不断增加,那么你可能确实有内存泄漏。

但我怀疑它会,除非你错误地使用boost :: ptr_vector。

答案 1 :(得分:2)

从它的外观来看,你正在使用boost :: ptr_vector。

我建议您使用Windows Perfmon正确识别应用程序内存使用情况。 有关如何在Windows 7中使用Perfmon的说明,请参阅this blog

答案 2 :(得分:1)

还有另一大块内存似乎是你忘记的:vec中分配的空间来保存指针。

本声明:

vec.clear();

delete使用T创建的所有new,但它没有释放vec自己分配用于保存所有指针的内存。如果您致电vec.capacity(),您会发现vec仍有足够的空间来容纳至少100000 T*

为了释放内存,请使用交换习语:

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

这会创建一个临时ptr_vector,然后在vec调用中获取swap()的内部存储空间。然后,当临时在;被销毁时,所有存储都被释放。