delete怎么释放电脑内存没释放内存

查看:2907|回复:8
助理工程师
struct List
& && &&&HBufC* aP
& && &&&List*
& && &&&};
我用的是链表,
for(TInt i=0;i&iIndex+iPos-1;i++)
& && &&&pp=pp-&
while(Info.Count()&iIndex+iPos)
& && &&&p=pp-&
& && &&&pp-&next=p-&
& && &&&delete p-&aP
删除了1000多个,加起来至少得几百K了吧,可程序占用的内存并没有丝毫的减少,程序退出后内存倒是释放了
助理工程师
不知道windows是怎样的,嘻嘻,我只是个编程爱好者,在symbian里貌似new的内存被delete后进程所占用的堆空间没减少,所以查看系统剩余内存并没有减少,但是自己的程序可以继续用被delete 掉的空间,只是个人猜测
助理工程师
1.没看到你对结构体成员进行内存分配。
2.内存应该有区块分配/回收机制,不到一定的粒度可能看不出变化。
助理工程师
malloc申请的内存都不是内存管理的一等公民.
在Win和Linux(Unix-Like)上面,malloc申请的都是堆上的内存,而堆是C运行库向OS申请的.
那么你free的内存也就是堆上的,应用占用的内存不会有明显改变,除非到一定程度那个堆被释放了.
delete是靠free实现的.
助理工程师
你的List定义的是成员变量,那就要等到析构时才释放,如果只是局部变量那么会用完释放~
初级工程师
我的意思是,我程序运行后只占100多K内存,随着我不断的new,堆在不断增大,达到1M多,但后来我又delete了很多,资源是释放了,但堆没变小,虽然我的程序在new时还可以使用之前被释放的空间但是其它程序难道也能用我的堆空间?如果不能得话那将近1M的空间占着却不用太浪费了,既然我new时堆能动态增大那我delete时怎么使它动态减小呢?
助理工程师
LZ的情况正常,要不容易整理内存碎片
那样的话,效率会很差
系统一般都是以页为单位分配,便于管理
你申请的地址,系统都有记载,但系统很少回读这些表内的内存现在状态或者说去整理碎片
所以就会一厢情愿认为你delete的内容在使用,
即使他已经被标记了未使用,放在相应的内存情况表
但当内存不足(或达到一定的情况)时,他就会适当的回读下,整理下内存碎片
(但如果现在情况不会引起内存危机,他一般是不会回读整理内存碎片的)
初级工程师
等堆被释放了,占用内存大小才会有显著的变化.
助理工程师
不管用什么为单位,都会有部分被浪费的;只能尽量减少在c或者c++中为什么free() 和delete释放内存,不直接在函数内部实现指针等于NULL,而是将其设置为野指针呢? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。128被浏览<strong class="NumberBoard-itemValue" title="1分享邀请回答void free(
void *memblock
他的参数虽然是指针,但本质还是值传递,函数内部没办法改变实参的值。后来的C++虽然有了引用类型,但是这块是继承过去的,不会有多大改动。至于C++的delete为什么不把操作数归零。原因大概是这样的。delete的操作数不一定是左值,右值也是允许的。而右值是不能赋值的。举例如下。int main(void)
int *p = new int[2];
delete (p+1);
Bjarne Stroustrup老爷子曾经解释过,C++明确允许编译器实现将delete的左值操作数归零,并且期望编译器能够做这件事儿。但是,出乎意料的是,大多数编译器,好像都偷了个懒,并没有实现它。如果你想要优雅地将delete的操作数归零,可以这样做。template&class T& inline void destroy(T*& p) { delete p; p = 0; }
并且,因为C++不允许右值的非const引用,有效防止了上述问题。参考:添加评论分享收藏感谢收起new[] 分配, delete释放内存,为什么不涨内存
[问题点数:20分,结帖人szn_409]
本版专家分:247
结帖率 77.78%
CSDN今日推荐
本版专家分:5082
本版专家分:48
本版专家分:86273
2011年3月 C/C++大版内专家分月排行榜第一2010年9月 C/C++大版内专家分月排行榜第一
2015年1月 C/C++大版内专家分月排行榜第二2012年3月 C/C++大版内专家分月排行榜第二2011年11月 C/C++大版内专家分月排行榜第二2010年6月 C/C++大版内专家分月排行榜第二2010年5月 C/C++大版内专家分月排行榜第二
2011年4月 C/C++大版内专家分月排行榜第三2011年2月 C/C++大版内专家分月排行榜第三2010年8月 C/C++大版内专家分月排行榜第三
本版专家分:16776
2016年8月优秀小版主优秀小版主2015年7月优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年4月潜水乐园小板版主2015年2月论坛优秀版主2014年11月论坛优秀版主
2015年11月 扩充话题大版内专家分月排行榜第一2015年7月 扩充话题大版内专家分月排行榜第一2015年1月 扩充话题大版内专家分月排行榜第一2014年9月 扩充话题大版内专家分月排行榜第一(补)2013年9月 扩充话题大版内专家分月排行榜第一2013年8月 扩充话题大版内专家分月排行榜第一2013年7月 扩充话题大版内专家分月排行榜第一
2016年3月 扩充话题大版内专家分月排行榜第二2015年12月 扩充话题大版内专家分月排行榜第二2015年6月 扩充话题大版内专家分月排行榜第二2015年2月 扩充话题大版内专家分月排行榜第二2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
2016年4月 扩充话题大版内专家分月排行榜第三2015年9月 扩充话题大版内专家分月排行榜第三2015年3月 扩充话题大版内专家分月排行榜第三2014年1月 扩充话题大版内专家分月排行榜第三2013年12月 扩充话题大版内专家分月排行榜第三2013年4月 C/C++大版内专家分月排行榜第三
本版专家分:137249
2017年 总版技术专家分年内排行榜第六
2018年1月 总版技术专家分月排行榜第一2016年12月 总版技术专家分月排行榜第一2016年11月 总版技术专家分月排行榜第一2016年10月 总版技术专家分月排行榜第一
2016年10月优秀大版主2016年8月优秀大版主
2018年5月 总版技术专家分月排行榜第二2017年12月 总版技术专家分月排行榜第二2016年9月 总版技术专家分月排行榜第二
本版专家分:368247
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:247
结帖率 77.78%
本版专家分:247
结帖率 77.78%
本版专家分:247
结帖率 77.78%
本版专家分:16776
2016年8月优秀小版主优秀小版主2015年7月优秀小版主2015年8月优秀小版主2015年9月优秀小版主2015年5月优秀小版主2015年4月潜水乐园小板版主2015年2月论坛优秀版主2014年11月论坛优秀版主
2015年11月 扩充话题大版内专家分月排行榜第一2015年7月 扩充话题大版内专家分月排行榜第一2015年1月 扩充话题大版内专家分月排行榜第一2014年9月 扩充话题大版内专家分月排行榜第一(补)2013年9月 扩充话题大版内专家分月排行榜第一2013年8月 扩充话题大版内专家分月排行榜第一2013年7月 扩充话题大版内专家分月排行榜第一
2016年3月 扩充话题大版内专家分月排行榜第二2015年12月 扩充话题大版内专家分月排行榜第二2015年6月 扩充话题大版内专家分月排行榜第二2015年2月 扩充话题大版内专家分月排行榜第二2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
2016年4月 扩充话题大版内专家分月排行榜第三2015年9月 扩充话题大版内专家分月排行榜第三2015年3月 扩充话题大版内专家分月排行榜第三2014年1月 扩充话题大版内专家分月排行榜第三2013年12月 扩充话题大版内专家分月排行榜第三2013年4月 C/C++大版内专家分月排行榜第三
本版专家分:15068
2015年10月 C/C++大版内专家分月排行榜第二
2015年12月 C/C++大版内专家分月排行榜第三2015年11月 C/C++大版内专家分月排行榜第三
本版专家分:137249
2017年 总版技术专家分年内排行榜第六
2018年1月 总版技术专家分月排行榜第一2016年12月 总版技术专家分月排行榜第一2016年11月 总版技术专家分月排行榜第一2016年10月 总版技术专家分月排行榜第一
2016年10月优秀大版主2016年8月优秀大版主
2018年5月 总版技术专家分月排行榜第二2017年12月 总版技术专家分月排行榜第二2016年9月 总版技术专家分月排行榜第二
本版专家分:368247
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:6725
2015年6月 C/C++大版内专家分月排行榜第三
本版专家分:4161
2015年2月 VC/MFC大版内专家分月排行榜第一
2015年1月 VC/MFC大版内专家分月排行榜第三
本版专家分:18975
匿名用户不能发表回复!|
CSDN今日推荐Linux下free/delete不释放内存-CSDN论坛
Linux下free/delete不释放内存
在linux下写了个程序,需要频繁的分配和释放内存,而当真正调用free/delete是,通过top命令查看,程序所占用的内存并没有真正释放。
在windows上程序就不会这样。
具体是什么原因?
glibc&free/delete&并不真正将物理内存规划给操作系统
换句话说,glibc会帮助管理内存,
只有在堆的顶部有大于128K的空间才归还内存给操作系统
还有人信top的显示啊。
引用&1&楼&dskit&的回复:glibc&free/delete&并不真正将物理内存规划给操作系统
换句话说,glibc会帮助管理内存,
只有在堆的顶部有大于128K的空间才归还内存给操作系统
因为我的程序是一个类似于守护进程的程序,需要一直运行。有时会出现内存被耗尽,但是用valgrind去检测,发现没有内存泄露的情况。弄得一头雾水。有什么好的方法可以解决吗?
引用&2&楼&taodm&的回复:还有人信top的显示啊。
那有什么工具可以实时地检测程序内存的使用情况吗?
通常,比如在x86上跑的linux。堆是从低向高增长的。当glibc的内存分配器发觉内存不足时,会向内核请求扩张数据段。这个数据段是紧接着以前的边界扩展的。新扩展出来的内存纳入到glibc的分配器管理。
当调用free()的时候,用户使用的内存返回给glibc的内存分配器。
当内存分配通过与一个阀值比较,认为它自己管理的空闲内存过多的时,它会收缩。
但是,收缩是要求从&内核已分配给glibc分配器的内存的最大地址,向小地址方向收缩的。
假设,这个时候,有一个堆上对象被分配在了那个最大地址。那么,无法完成收缩,即便是空闲内存非常多,也不能交还给kernel以供其他进程使用。
反之,则可以正常的交还内存给kernel。
应该有一个函数malloc_trim(),可惜我在man&malloc_trim时找不到。
对于楼主的问题,一个方案就是考虑mmap()来解决。
具体的可以参考Linux&System&programming.&第8章。
引用&3&楼&alexapples&的回复:引用&1&楼&dskit&的回复:
glibc&free/delete&并不真正将物理内存规划给操作系统
换句话说,glibc会帮助管理内存,
只有在堆的顶部有大于128K的空间才归还内存给操作系统
因为我的程序是一个类似于守护进程的程序,需要一直运行。有时会出现内存被耗尽,但是用valgrind去检测,发现没有内存泄露的情况。弄得一头雾水。有什么好的方法可以解决吗?
你再仔细分析分析你的代码,重新审视你的内存分配回收策略吧
看看这篇文章,或许能对你有帮助
这个与操作系统对内存的管理有关!只要内存不是疯长就行了,如果是一个Server程序,跑上几天几夜内存使用稳定就没有问题。
引用&3&楼&alexapples&的回复:因为我的程序是一个类似于守护进程的程序,需要一直运行。有时会出现内存被耗尽,但是用valgrind去检测,发现没有内存泄露的情况。弄得一头雾水。有什么好的方法可以解决吗?
那我觉得你的程序在内存管理(不是系统内存管理)上就存在问题,如果要根本解决,我认为你该考虑修改你的程序。
top看到的内存有的时候是假的。需要长时间看看。尤其用stl的时候经常会有这种情况。
引用&2&楼&taodm&的回复:还有人信top的显示啊。
lz别信了。。。这是正解。
5楼讲的不错!
&#xe60a;回复用delete释放内存是什么意思【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:584,528贴子:
用delete释放内存是什么意思收藏
我先声明char*p=new char[100]
再初始化p="asdasd"
接着我delete []p 这个时候p指向的内存区上的“asdasd”就没有了吗?
c++不清楚,要是c的malloc还可以给你讲讲。。
==================前面申请的内存,后指针重新指向常量字符串,所以你delete 是delete了一个常量字符串而你的char[100]所申请的内存,泄露了。
不是没有了,而是操作系统把那些内存的使用权收回了。
另外,像你先是申请了内存,又来个 p = "xxx",这会导致编译器专门开辟一块空间用来存放xxx字符串,然后使p指向他;原先申请的内存会因为无法释放导致内存泄漏。
一个接线员接到一个客户的电话,客户是个磕巴说话有点慢:我我我……想想想问下,我我我……电……话话话费……最最最近……怎么这样费?接线员只说:大大大大哥就就就你这样能能能不费吗?之后他被开除了……
c用free释放内存,delete貌似只是删除并没有释放内存。
登录百度帐号

我要回帖

更多关于 mysql delete释放空间 的文章

 

随机推荐