VC STL vector 内存泄漏

阿麦 2013-06-15 02:36:29
今天被内存泄漏整惨了。经过很纠结的测试,终于找到原因:
vector!
对,就是它。
程序里用它来保存分阶段的计算结果,当程序终止时,产生了内存泄漏

class myclass
{
...
vector<int> m_result
};

...
void myclass:function(void)
{
vector<int> result;
...//获得阶段数据
m_result.insert(m_result.end(), result.begin(), result.end());
...
}

vector 可以不显式释放内存,但这里是不行的,会有内存泄漏!想不通的举个手,我也想不通

最后用了一个变通方式:
在类的析构中

myclass::~myclass()
{
...//其他处理
vector<int>().swap(m_result);//增加这句后,就不再有内存泄漏
}


不知道大家有没有遇到这类问题,有没有更好的解决办法呢。
...全文
401 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我也遇到了同样的问题,不过使用了swap,输出窗口仍然报泄露。 用_CrtSetBreakAlloc捕获了下,发现调用过程是: push_back → insert → _Insert_n → this->_Alval.allocate → _Allocate → ::operator new 其中_Insert_n中有这样一段代码:

size_type _Capacity = capacity();

if (_Count == 0)
	;
	else if (max_size() - size() < _Count)
		_Xlen();	// result too long
	else if (_Capacity < size() + _Count)
		{	// not enough room, reallocate
		_Capacity = max_size() - _Capacity / 2 < _Capacity
			? 0 : _Capacity + _Capacity / 2;	// try to grow by 50%
		if (_Capacity < size() + _Count)
			_Capacity = size() + _Count;
		pointer _Newvec = this->_Alval.allocate(_Capacity);
这个try to grow by 50% ??? 我一共插入了5个元素,这么说在插入第5个元素时,_Capacity由4变成了6,传入了this->_Alval.allocate。而clear只会按5个元素清除,刚好漏了一个!!
  • 打赏
  • 举报
回复
嗯……发现不是这个原因。经过进一步研究,我的问题的原因是,包含这个vector的类的基类的析构函数未声明为虚函数,而外面delete的是基类指针,实际上没有进入包含这个vector的类的析构函数中。 ~vector() → _Tidy() → this->_Alval.deallocate(_Myfirst, _Myend - _Myfirst); _Myend对应capacity()的大小,而_Mylast对应size()的大小。
ochonglangzheo 2013-06-16
  • 打赏
  • 举报
回复
默认情况下vector执行的是一种“用时间换空间”的做法,即每插入一条数据会调用2次拷贝构造函数,然后再调用析构函数析构一次,析构一个多余的数据
漫步者、 2013-06-16
  • 打赏
  • 举报
回复
那句是不会内存泄露的,是你的堆栈给破坏了啦
startservice 2013-06-16
  • 打赏
  • 举报
回复
觉得也是没有内存泄露。
zhao1zhong6 2013-06-16
  • 打赏
  • 举报
回复

void myclass:function(void)
{
vector<int> result;
//获取数据
result.push_back(...);
result.push_back(...);
result.push_back(...);
result.push_back(...);
result.push_back(...);
m_result.insert(m_result.end(), result.begin(), result.end());
...
}
//为什么不这样写呢?
void myclass:function(void)
{
//获取数据
m_result.push_back(...);
m_result.push_back(...);
m_result.push_back(...);
m_result.push_back(...);
m_result.push_back(...);
...
}
zhao1zhong6 2013-06-16
  • 打赏
  • 举报
回复
应该没有内存泄露,不过我从来不这么写。 既然在函数里面获取数据,你那个临时的容器不是多余吗?
  • 打赏
  • 举报
回复
这不是内存泄漏。。。
taodm 2013-06-15
  • 打赏
  • 举报
回复
扔了你那个垃圾的内存泄露检测软件。
阿麦 2013-06-15
  • 打赏
  • 举报
回复
引用 8 楼 yshuise 的回复:
m_result.insert(m_result.end(), result.begin(), result.end()); ========================================= 插入的是new堆,所以要释放,但是析构函数不是这样写的。
原因应该是在这里了 有没有其他办法可以把一个vector添加到另一个后面呢?除了insert以外
阿麦 2013-06-15
  • 打赏
  • 举报
回复
并且,在vector存放数据后,在析构增加vector<int>().swap(m_result);就没汇漏。 这两点,不知道是不是能充分证明是vector的呢?
阿麦 2013-06-15
  • 打赏
  • 举报
回复
没想到大家都不信。 我是这样确定的: 当vector不存数据时,没有泄漏报告; 存了数据,就泄漏。 这样,应该可以确定是vector产生的吧
DeDeWo 2013-06-15
  • 打赏
  • 举报
回复
vector调用clear()并不会释放空间,必须的得用swap
yshuise 2013-06-15
  • 打赏
  • 举报
回复
m_result.insert(m_result.end(), result.begin(), result.end()); ========================================= 插入的是new堆,所以要释放,但是析构函数不是这样写的。
yshuise 2013-06-15
  • 打赏
  • 举报
回复
不会内存泄露,栈是自动释放
buyong 2013-06-15
  • 打赏
  • 举报
回复
应该没有内存泄漏,用stlport最新版试试?
ri_aje 2013-06-15
  • 打赏
  • 举报
回复
楼主怎么确定内存泄漏的?
qq120848369 2013-06-15
  • 打赏
  • 举报
回复
不应该泄漏的,STL实现很多都是不用内存池的。
十八道胡同 2013-06-15
  • 打赏
  • 举报
回复
我的习惯 在西沟函数里都调用clear的
elated 2013-06-15
  • 打赏
  • 举报
回复
vector还能产生内存泄露?
加载更多回复(1)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧