std::string 内存释放 问题。

叁哥_ 2010-07-29 12:31:31
大家都知道 std::string 底层用了内存池,即使string对象实例析构内存并不归还系统,仍保存在内存池中。

如果内存有限,而程序一次大量使用了std::string而导致大量系统内存被内存池占用,之后万一其他调用需要内存不是完蛋了?


如何是好呀?



...全文
2455 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
fryhunter 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 compupo 的回复:]

TMD什么叫内存池,难道我老了么?我只知道heap stack,其它一切都是浮云,有木有
[/Quote]

还有一个叫static。string在这个里面,静态区
compupo 2011-07-09
  • 打赏
  • 举报
回复
TMD什么叫内存池,难道我老了么?我只知道heap stack,其它一切都是浮云,有木有
healer_kx 2010-07-29
  • 打赏
  • 举报
回复
睡觉了,我说的可能是错的。
liutengfeigo 2010-07-29
  • 打赏
  • 举报
回复
向甘草老大看齐
healer_kx 2010-07-29
  • 打赏
  • 举报
回复
如果内存池不够了,估计他会再create 内存池的。。。
algorithms_memo 2010-07-29
  • 打赏
  • 举报
回复
当大于128字节时候,一般会直接用malloc/free代替,而不在内存池中获取/释放
xl1016807272 2010-07-29
  • 打赏
  • 举报
回复
用内存池管理相比普通的C语言的动态内存,在内存占用量上的峰值是一样的,唯一的区别是,在从语言的的动态内存会逐渐的随着程序运行,而被释放。stl的内存池则是保留着,直到程序结束后一起坏给系统。
但是想想,我们做一个程序,这个进程能在用户的手中直到被关掉,坚持多久……
更何况,现在的普遍家用机的内存就有多大,一个程序多占用一会内存对它的压力简直是蚍蜉撼树。
xl1016807272 2010-07-29
  • 打赏
  • 举报
回复
那种东西有几兆就不少了
[Quote=引用 17 楼 wyz007134 的回复:]

大家都知道 std::string 底层用了内存池,即使string对象实例析构内存并不归还系统,仍保存在内存池中。

我还真不知道string使用了内存池的算法...只是在自己写string类的时候,简单的new和delete罢了...
语言的设计者当然会考虑到极限情况,但是这种极限情况是基本上不会发生的,所以正如某位仁兄所说,不必杞人忧天了,1G的纯字符串文档要有多少内容?估计整本的“……
[/Quote]
xl1016807272 2010-07-29
  • 打赏
  • 举报
回复
那个要用多少的字符串才能把系统的内存占完啊,不就相当于用文本文件装满一两个g的硬盘一样吗??除非变得程序本身就有问题,无底洞当然有一天会把内存吃完!
wyz007134 2010-07-29
  • 打赏
  • 举报
回复
大家都知道 std::string 底层用了内存池,即使string对象实例析构内存并不归还系统,仍保存在内存池中。

我还真不知道string使用了内存池的算法...只是在自己写string类的时候,简单的new和delete罢了...
语言的设计者当然会考虑到极限情况,但是这种极限情况是基本上不会发生的,所以正如某位仁兄所说,不必杞人忧天了,1G的纯字符串文档要有多少内容?估计整本的“辞海”+四大名著吧...
icansaymyabc 2010-07-29
  • 打赏
  • 举报
回复
别担心,内存不会用完的,string的内存管理器向操作系统申请内存,操作系统会在必要的时候将暂时不用的内存交换到硬盘上去。如果你的程序很特殊,引起内存震荡(频繁地将刚从硬盘换出的内存又换到硬盘上去),顶多是降低程序运行速度,不会带来灾难性的后果。

除非你写的是32位的应用,这种应用程序有2G的内存空间限制,而你的程序一次大量使用的内存总量超过2G,例如你将你的string内存池占用空间增加到1.4G(难道你真的需要同时在内存中处理1.4G那么多的字符串吗?),这就非出错不可了。那样只能通过改写成 64 位应用来解决了。

64位操作系统中的64位应用程序的内存限制是16TB,如果你的应用程序一次大量使用的内存总量超过了16TB,你只能等待 128位的CPU和128位的操作系统出来才行了。
java_xin 2010-07-29
  • 打赏
  • 举报
回复
学习下。帮顶。。
chenyu2202863 2010-07-29
  • 打赏
  • 举报
回复
std::string用了内存池么?
std::string的内存分配是allocator,在MS的实现里,其实就是普通的new。在SGI里倒是小于128字节就会使用内存池~

难道string自己维护了内存块?没有吧~
std::string连cow都没用,因为要保证Thread Safe则Performance严重低下!
genlic 2010-07-29
  • 打赏
  • 举报
回复
楼主心思细腻啊~~
  • 打赏
  • 举报
回复
楼主知道虚拟内存吗?系统内存不只你的物理内存
ARy 2010-07-29
  • 打赏
  • 举报
回复
参考资料: http://group.gimoo.net/review/74845
ARy 2010-07-29
  • 打赏
  • 举报
回复
C/C++ code //内存整理其实很简单,就用一个函数EmptyWorkingSet,对每个进程使用这个就可以了 #include <windows.h> #include <stdio.h> #include <tlhelp32.h> #include <psapi.h> #pragma comment (lib,"psapi.lib") BOOL test() { HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(SnapShot==NULL) { return FALSE; } PROCESSENTRY32 ProcessInfo;//声明进程信息变量 ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小 //返回系统中第一个进程的信息 BOOL Status=Process32First(SnapShot,&ProcessInfo); while(Status) { HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,ProcessInfo.th32ProcessID); if(hProcess) { SetProcessWorkingSetSize(hProcess,0,0); //内存整理 EmptyWorkingSet(hProcess); CloseHandle(hProcess); } printf("%s\n",ProcessInfo.szExeFile); //获取下一个进程的信息 Status=Process32Next(SnapShot,&ProcessInfo); } return TRUE; } int main() { test(); return 0; }
http://blog.csdn.net/Y___Y/archive/2007/06/19/1658455.aspx
elegant87 2010-07-29
  • 打赏
  • 举报
回复
不会的
绝对会够你用的
iambic 2010-07-29
  • 打赏
  • 举报
回复
不用杞人忧天。
鸵鸟 2010-07-29
  • 打赏
  • 举报
回复
自己写allocator , 内存不够自己catch std::bad_alloc, 然后重新规划内存
加载更多回复(4)

64,682

社区成员

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

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