C++ 中不停的new内存,delete内存,会不会出现new失败的情况?

Timor君 发布于 2012/07/15 16:38
阅读 2K+
收藏 0

1. 不停的new和delete,最后会不会出现new失败的情况?为什么?
2. 如果出现new失败的情况,该怎么去解决这个问题呢?

求指导

加载中
0
helloworld_go
helloworld_go

1、有可能,不过可能性很小,主要是因为内存碎片。

2、重起机器即可,很简单的。

Timor君
Timor君
情何以堪!是服务器代码,怎么能随便重启?
0
周翼翼
周翼翼
认真的代码, 一定要要错误处理. new失败了, 该怎么办就怎么办, 如果是顶层代码,能处理就处理, 处理不了就收拾一下,写点log什么的,abort掉.如果在底导一点的, 把错误反应到上层, 让他们处理.
周翼翼
周翼翼
回复 @cghy2011 : 这个没有想过.也没必要考虑. 分配失败要么是代码里有内存泄漏,这个一定要改过来的.要么就是硬件太水了,换硬件.语言层面, 应该没办法.事实上, 如果不是内存泄漏, 分配失败的情况应该不多.
Timor君
Timor君
有没有想过该怎么避免申请失败?
0
firstrose
firstrose

自己注意一下分配内存的释放喽。不要懒。

不想关心内存的释放,只好另想办法。

要简单的话,我建议你使用memcache或者redis。把它们当作一个内存池用,然后程序里固定分配若干块内存,当作交换区。但是使用上比较不方便

想使用方便又要解决问题,你可以考虑自己实现一个池,自己做套带碎片整理的内存分配机制。

0
拉菲一箱
拉菲一箱

理论上会,实际上只要free正常,极少会遇到,遇到也没有办法,除非你不动态申请和释放。

根据电信级运营代码,里面也有很多不停地malloc和free,这些好几年都不会出问题,因此放心用吧

 

 

CheckStyle
CheckStyle
回复 @cghy2011 : 一样的
周翼翼
周翼翼
回复 @cghy2011 : 一句话, 如果不泄漏, 基本没问题.
mallon
mallon
回复 @cghy2011 : 一样的
Timor君
Timor君
是new 和 delete , 这个和 malloc 和 free 不一样吧
0
ChenQi
Timor君
Timor君
- - !
0
姑妄听之
姑妄听之

这个问题最容易找到答案了。你自己写个测试程序,不断的new/delete内存。一直开着测试,直到出问题或者你认为足够好了截至。不就成了。

0
l
laosong
那不停的1+1 是不是一段时间后就不等于2了呢,如果出现这种低级问题,那计算机还叫计算机吗
0
xinzaibing
xinzaibing

肯定不会有问题啦

除非内存泄漏,或者硬件有问题

通常如果是不停得new和delete小块内存的操作要用内存池代替了

0
猫哥-u
猫哥-u
考虑使用内存池的方式设计,即便产生了碎片也预先分配的内存块中,每次要通过placement new从内存块中分配内存创建对象。
0
l
leyaya.cn
如果new出稍大块的内存,失败一定会发生,原因就在于内存碎片太多后,当在申请一块大内存时,系统无法分配一块连续的没有使用过的内存给你,解决方法就是申请一大块内存,在这一大块内存中再进行自己的分配,而不用系统的new,可以参考内存池的思想,其实nginx的内存分配思想更好,直接分配一大块内存,进程所需内存在上面再划分,进程结束时再释放内存,对于长期运行的服务很有意义。
返回顶部
顶部