【发布时间】: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;
}
-
内存泄漏:
int main() { VecContainer *a; while(true) { a = new VecContainer(); delete a; } } -
好(因为没有使用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