vector 内存无法释放

binling_bc 2012-05-14 10:16:17
问题1:vector<string> 连续push_back 100000个字符串 ,然后clear掉 发现内存会涨 相较于未push之前
问题2:当push_back达到一定数量之后效率低 原因是什么 有啥好的解决方法deque?


谢谢
...全文
671 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ydldhr 2012-05-16
  • 打赏
  • 举报
回复
push_back 过多,会总分配内存的,效率当然就低了
youkuxiaobin 2012-05-16
  • 打赏
  • 举报
回复
clear之后给原来push_back的这块内存是不会释放掉的,当然这个不同于内存泄露。
当下次再有分配内存的时候就不用向系统申请了,就直接使用这块内存

而且vector的实现一般是2的N递增模式,当vector元素个数超过2的N次方,就会重新申请内存空间
比如
数组元素个数 实际分配内存
1 1
2 2
3 4
4 4
5 8
.
.
.
.
zhangsongcui 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

引用 11 楼 的回复:

引用 8 楼 的回复:
引用 4 楼 的回复:

vector是连续的内容,默认大小很小,超出的时候大小会涨

你可以把vector想象成连续的数组
默认为 string* Vec = new string[1];
当超出的时候,vector会执行重新new和再把旧数据内存拷贝过去
string* Vec = new string[1*2];
……
[/Quote]
http://codepad.org/QjOClH4r
详见Effective STL 条款17
zhangsongcui 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 8 楼 的回复:
引用 4 楼 的回复:

vector是连续的内容,默认大小很小,超出的时候大小会涨

你可以把vector想象成连续的数组
默认为 string* Vec = new string[1];
当超出的时候,vector会执行重新new和再把旧数据内存拷贝过去
string* Vec = new string[1*2];
再超出继续翻倍
string*……
[/Quote]
reverse只会扩大capacity,不会缩小capacity
要缩小capacity可使用交换技巧
binling_bc 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

用2楼的就行了
C/C++ code
vector<string> a;
{
vector<string> t;
swap(a, t);
}
这样就clear并且释放内存了
[/Quote]

我试了 不过跟原来相比 还是涨了
gemo 2012-05-15
  • 打赏
  • 举报
回复
LZ,我认为你这种情况应该自己开一块内存处理,弄个pool进行管理
  • 打赏
  • 举报
回复
用2楼的就行了
	vector<string> a;
{
vector<string> t;
swap(a, t);
}
这样就clear并且释放内存了
sl51314240 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 4 楼 的回复:

vector是连续的内容,默认大小很小,超出的时候大小会涨

你可以把vector想象成连续的数组
默认为 string* Vec = new string[1];
当超出的时候,vector会执行重新new和再把旧数据内存拷贝过去
string* Vec = new string[1*2];
再超出继续翻倍
string* Vec = new stri……
[/Quote]

如果你想要控制Vector的大小,clear之后再调依次Vector.reserve(1)设为1个string的容量内存就释放了,如果还不行,直接vector也new出来用,用完后delete
Saleayas 2012-05-15
  • 打赏
  • 举报
回复
如果你连续 push 这么多,那么应该先 reserve 容量。
binling_bc 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

vector是连续的内容,默认大小很小,超出的时候大小会涨

你可以把vector想象成连续的数组
默认为 string* Vec = new string[1];
当超出的时候,vector会执行重新new和再把旧数据内存拷贝过去
string* Vec = new string[1*2];
再超出继续翻倍
string* Vec = new string[2*2]
strin……
[/Quote]

我是写了个试验才写100000,实际情况是不晓得初始大小是多少 动态增加
binling_bc 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

不知道LZ说的会涨是什么意思,不过我一般这么写。
C/C++ code

vector<string> a;
...
...
a = vector<string>(); // or swap(a, vector<string>());
[/Quote]

vector<string> a这里我记下exe占用的内存为720K
for(int i = 0; i < 100000; i++)
{
a.push_back(str);
}

这时 exe占用的内存为24,000K

a.clear();
这时exe占用的内存为1200K左右 清空了 居然还增加了近500K的内存
zhqhaiqing 2012-05-15
  • 打赏
  • 举报
回复
4楼解释得很透切了
帅得不敢出门 2012-05-15
  • 打赏
  • 举报
回复
问题1:vector<string> 连续push_back 100000个字符串 ,然后clear掉 发现内存会涨 相较于未push之前
默认构造时会给一个固定的大小空间, 比如16, 当入栈超过这个数时,以一定的规律自增空间,比如*2N方, 具体可以看看 stl的实现。

问题2:当push_back达到一定数量之后效率低 原因是什么 有啥好的解决方法deque?
可以考虑list
sl51314240 2012-05-15
  • 打赏
  • 举报
回复
vector是连续的内容,默认大小很小,超出的时候大小会涨

你可以把vector想象成连续的数组
默认为 string* Vec = new string[1];
当超出的时候,vector会执行重新new和再把旧数据内存拷贝过去
string* Vec = new string[1*2];
再超出继续翻倍
string* Vec = new string[2*2]
string* Vec = new string[4*2]
依次类推。Vec占用空间会越来越大,你的clear释放的仅仅是string所占的空间,但是vector占用空间变大了,总内存当然占用更大

如果要初始化的时候就占用那么大可以用reserve方法,让vector直接就占用那么大的内存

你可以先reserve 100000,再push_back 100000个字符串,你会发现释放后与push_back前占用空间一样
nice_cxf 2012-05-15
  • 打赏
  • 举报
回复
vector clear之后内存并不会马上释放
Saleayas 2012-05-15
  • 打赏
  • 举报
回复
那你的程序就要在这里优化。
比如,当检测到
if (Size > N)
{
N <<= 2;
Reserve(N);
}
binling_bc 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

如果你连续 push 这么多,那么应该先 reserve 容量。
[/Quote]

我不晓得刚开始有多少数值 上次的100000是我假设的
binling_bc 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

LZ,我认为你这种情况应该自己开一块内存处理,弄个pool进行管理
[/Quote]

这个能否举个简单的例子参考下?如果能自己管理 最好
mars_man 2012-05-15
  • 打赏
  • 举报
回复
不知道LZ说的会涨是什么意思,不过我一般这么写。

vector<string> a;
...
...
a = vector<string>(); // or swap(a, vector<string>());
W170532934 2012-05-14
  • 打赏
  • 举报
回复
我觉得这个比较复杂了,vector是连续的内存上的,可是string又是一个动态管理内存的东西。搞多了估计会出问题是必须的了

64,637

社区成员

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

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