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



打开任务管理器查看内存使用情况时,它将从使用的.3MB内存开始。将100000个对象添加到ptr_vector后,将使用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;
}

谢谢你的帮助。

您不能依赖windows任务管理器来获得内存使用,至少不能这样。

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

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

但我怀疑它是否会,除非您错误地使用了boost::ptr_vector。

从外观上看,您应该使用boost::ptr_vector。

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

您似乎忘记了另一大块内存:vec中分配用于保存指针的空间。

此声明:

vec.clear();

delete释放了您用new创建的所有T,但它没有释放vec本身分配的内存来保存所有这些指针。如果您调用vec.capacity(),您会发现vec仍然有足够的空间容纳至少100000个T*

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

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

这将创建一个临时ptr_vector,然后在swap()调用中占用vec的内部存储。然后,当临时存储器在;处被销毁时,所有存储器被释放。

相关内容

  • 没有找到相关文章

最新更新