【问题标题】:C++ leaking memory with boost::ptr_vectorC++ 使用 boost::ptr_vector 泄漏内存
【发布时间】:2013-07-03 14:40:27
【问题描述】:

当打开任务管理器查看内存使用情况时,它会以 0.3MB 内存使用开始。将 100,000 个对象添加到 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;
}

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        此声明:

        vec.clear();
        

        deleted 你用new 创建的所有Ts,但它并没有释放vec 本身分配用于保存所有这些指针的内存。如果您调用vec.capacity(),您会看到vec 仍有足够的空间容纳至少100000 个T*

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

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

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

        【讨论】:

        • 非常感谢!这占内存使用量增加的大部分。额外的一点可能是由于 Yohan 对保留内存页面的回答。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多