社区
C++ 语言
帖子详情
std::string 内存释放 问题。
叁哥_
2010-07-29 12:31:31
大家都知道 std::string 底层用了内存池,即使string对象实例析构内存并不归还系统,仍保存在内存池中。
如果内存有限,而程序一次大量使用了std::string而导致大量系统内存被内存池占用,之后万一其他调用需要内存不是完蛋了?
如何是好呀?
...全文
2455
24
打赏
收藏
std::string 内存释放 问题。
大家都知道 std::string 底层用了内存池,即使string对象实例析构内存并不归还系统,仍保存在内存池中。 如果内存有限,而程序一次大量使用了std::string而导致大量系统内存被内存池占用,之后万一其他调用需要内存不是完蛋了? 如何是好呀?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
楼主心思细腻啊~~
高性能架构探索
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)
std
::
string
的两种清空方式
一般清空字符串有两种方式: (1)给字符串赋值空串。
std
::
string
str; str = "123"; str = "";//给字符串赋空串来清空 (2)调用
std
::
string
::clear()函数。
std
::
string
str; str = "123"; str .clear();//调用
std
::
string
::clear()函数来清空字符串 在这两种方式中,方法二运行效率高些,所以应尽可能用第二种方法清空字符串。 参考:https://blog.csdn.net/D
标准C++类
std
::
string
的
内存
共享和Copy-On-Write(写时拷贝)
标准C++类
std
::
string
的
内存
共享和Copy-On-Write(写时拷贝),引用计数实现
std
::
string
底层原理分析
std
::
string
作为我们经常使用的一种STL容器,我们是否某个时刻有想过它的底层到底是如何实现的?其实在
std
::
string
的历史中,出现过几种不同的方式。可以从一个简单的
问题
来弹错,一个
std
::
string
对象占据的
内存
空间有多大?即sizeof(
std
::
string
)的值为多大?如果我们在不同的编译器(VC++、GNU、Clang++)上去测试,可能会发现其值是不同的;即使是GNU,不同的版本,获取的值也不同。
【C++基础】
std
::
string
详解
std
::
string
是 C++ 标准库提供的用于处理字符串的类。它在 头文件中定义。
std
::
string
提供了一种灵活、高效的字符串表示方式,相比于 C 语言中的字符串表示(使用字符数组或指针),
std
::
string
更易于使用,更安全,并且提供了许多便捷的操作。
std
::
string
C++/C++11中
std
::
string
是个模板类,它是一个标准库。使用
string
类型必须首先包含头文件。作为标准库的一部分,
string
定义在命名空间
std
中。 构造函数初始化 #include &lt;iostream&gt; #include &lt;
string
&gt; int main () {
std
::
string
s0 ("Hello World"); //根据已有字符串构
C++ 语言
64,682
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章