【问题标题】:Dynamically allocated std::vector seems to have memory leak动态分配的 std::vector 似乎有内存泄漏
【发布时间】:2012-04-19 13:17:51
【问题描述】:

感谢大家,在整个项目中再次检查后,真正的问题是缺少虚拟析构函数......导致内存泄漏......

#include "stdafx.h"
#include <vector>

class VecContainerParent
{
public:
    VecContainerParent(){};

没有这一行:

    virtual ~VecContainerParent(){};

导致内存泄漏

};

class VecContainerChild : public VecContainerParent
{
public:
    VecContainerChild(){};

    //virtual ~VecContainerChild(){};
private:
    std::vector<int> vec;
};

////////// WITH MEMORY LEAK ///////////////


int _tmain(int argc, _TCHAR* argv[])
{
    VecContainerParent *a;
    while(true)
    {
        a = new VecContainerChild();
        delete a;
    }
} 

///// 原帖 ////////// 当在类中使用向量时,我遇到了内存泄漏问题,然后将此对象与 new & delete 一起使用。 类中的向量似乎没有释放内存。 为了测试这一点,我在任务管理器中看到进程的内存急剧增加。

请看下面的例子:

class VecContainer
{
public:
       VecContainer(){};
private:
       std::vector<int> vec;
}
  1. 内存泄漏:

    int main()
    {
        VecContainer *a;
        while(true)
        {
            a = new VecContainer();
            delete a;
        }
    }
    
  2. 好(因为没有使用ptr):

    int main()
    {
        while(true)
        {
            VecContainer a;
        }
    }
    

【问题讨论】:

  • 在任一代码 sn-p 中都没有内存泄漏。
  • ...除非您将默认的operator new 和/或operator delete 替换为有缺陷的版本。
  • 您能否发布一些证据证明这是内存泄漏?这里没有明显的泄漏。
  • 另外,如果内存管理器在情况 1 中每次循环都没有重用相同的内存,它可能看起来就像是“泄漏”内存,因为越来越多物理 RAM 将分配给进程的虚拟地址空间,因此像 top 这样的工具会显示内存使用量增加。不过,这只是一个幻影。一旦其他东西需要它,它就会被回收。
  • 不能保证delete 会将内存释放回操作系统;小的分配通常保留在堆中以供重用。但我当然希望 sn-p 1 只分配少量内存然后重用它;如果使用量确实不断增加,那么就会发生一些可疑的事情。

标签: c++ stl memory-leaks vector


【解决方案1】:

这是典型的。当你

   a = new VecContainerChild();
    delete a;

通过指向其基类子对象的指针删除对象,您调用未定义的行为除非基类具有虚拟析构函数。基本上,在这种情况下不会运行孩子的析构函数。

This might be a question to study further.

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 2016-12-11
    • 2021-10-01
    • 1970-01-01
    • 2021-09-14
    • 2017-02-19
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    相关资源
    最近更新 更多