MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 关于C++中New的疑惑!该怎么处理

关于C++中New的疑惑!该怎么处理

www.MyException.Cn  网友分享于:2015-08-26  浏览:27次
关于C++中New的疑惑!
C++中的New自然是有它独特的好处,然而我却为如下的问题感到疑惑。
比如我用new动态声明了一个长度为10的数组,可是后来发现长度不够用了,我要改成20个,那么我怎么做呢?
1:重新new一个20个长度的数组,把数据Copy到这个数组并把原来的数组内存释放。
2:使用vector之类的C++内置数组类型。
3: ...
4:一开始就声明一个足够大的内存。

我不太清楚vector的内存分配情况,但我知道用new分配的第一个数组空间不会用到第二个数组,相当于第一个数组内存空间被“碎片化”了,因为它可能在程序退出之前永远不会再用到。

然而上面的第三种情况似乎是C语言中的realloc函数,至少这个函数在把10个长度的数组有可能被用到后来的20个长度中。因为这个函数是在原来内存的后面扩展空间。可是realloc函数是与malloc配对使用的,这里又不合适用到new了。

到底有没有一个“最合适”的做法呢?
我查了关于碎片的问题,一种说法是不用管它,这个似乎说不过去。另一个说法是使用内存池,不会为了这么简单的一个应用就去写一个复杂的池代码吧。

上面的4当然不是合适的了。那该怎么做?请高手们说一说自己的看法。

------解决方案--------------------
第一种方法最保险
重新new一个20个长度的数组,把数据Copy到这个数组并把原来的数组内存释放
------解决方案--------------------
用new分配的第一个数组空间不会用到第二个数组,相当于第一个数组内存空间被“碎片化”了,因为它可能在程序退出之前永远不会再用到。

--------------------
可能?你担心太多了,你申请的是物理内存还不一定呢。
------解决方案--------------------
重新new一下吧
------解决方案--------------------
vector就是先分配空间,不够了,就重新申请,同时进行数据copy,为了提高vector效率,他就可以先reserve一块大的空间,然后在这个里面使用
------解决方案--------------------
但我知道用new分配的第一个数组空间不会用到第二个数组,相当于第一个数组内存空间被“碎片化”了,因为它可能在程序退出之前永远不会再用到。 
==这个说法不全对。第一部分是对的,你再new时,以你目前的处理,前一个数组肯定还没有delete掉,自然不会使用了。
不过你new第二个数组后,你自然要将第一个数组内容复制过来,然后再将第一个数组delete掉,那么这个空间就又归系统所有了,在你的程序退出前是有可能再次进行分配的,不会程序退出前永远不会再用到,否则不就是内存泄漏了么?
====================
不管vector是怎么处理的,如果你先分配的空间后续的物理空间已经被其它进程之类的所占用,那么任何形式的空间再分配和扩展函数也不可能在物理上让这个空间继续向后延续。所以必然是如同oyljerry所述的一种方式,这个对象帮你完成了你先前需要自己处理的工作,而且能够有各种内存处理的安全保障。
------解决方案--------------------
上面有2位大神,我好好学习!
------解决方案--------------------
还是具体情况,具体分析吧,各有各的优点
------解决方案--------------------
既然是小程序,那么用new分配后delete后成碎片也不会有太大影响吧。。。
你觉得现在的电脑会因为一点内存泄漏或者存在碎片而出现程序缓慢问题么?
而且delete后的内存块其他程序是可以申请并使用的。。。
------解决方案--------------------
两位牛人都出面了,学习一下了~
------解决方案--------------------
内存碎片,好像超出了我们该考虑的范畴,你保证它不泄露就行了。
------解决方案--------------------
学习了,呵呵
------解决方案--------------------
探讨
引用:
内存碎片,好像超出了我们该考虑的范畴,你保证它不泄露就行了。


我赞成这个说法。
可我现在想到了这个问题,总不能留着遗憾去写程序吧。真要是哪一天写一个服务程序运行好些天,那么碎片会占满内存的。当然这不是我问的问题,只是想知道高手们怎么样看待这个问题。

------解决方案--------------------
我感觉 楼主 没有正确理解 new delete 与 malloc free的差别 
还有 碎片的问题的确可能存在 不过这个应该是系统管理的 “我查了关于碎片的问题,一种说法是不用管它,这个似乎说不过去。” 这个当然说得过去了。只要你正确的delete了 系统会适当的分配的 不会出现永远用不上的情况 。
------解决方案--------------------
探讨
虽然第一个数组Delete[]后回到了系统,但是因为第二个数组占用了位置,所以第一个数组的空间和第二个数组后面的空间是不连续的。如果后来的程序需要的内存都比第一个数组的大,那么这一块就用不到了。相当于是碎片了。如果用realloc好像出现这样的碎片的可能性就小了。当然像10个长度的连续内存可能会很快被用到。但是如果再小一些,那么成为碎片的可能性就会再大一些。

当然现在的机子内存都很大,可以不在乎这点内存,可是要细细研究的话,怎么做更好呢。

------解决方案--------------------
是个问题。。。
---------------------
采用二维管理
一次性申请一个页(假设页大小为1024BYTE)
不够用时再申请一个页。

维护一张页表(可以是链表)ToP。
------解决方案--------------------
STL中,vector分配内存的机制就是用的内存池,根本就不用你自己担心。
------解决方案--------------------

文章评论

我的丈夫是个程序员
我的丈夫是个程序员
我是如何打败拖延症的
我是如何打败拖延症的
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
每天工作4小时的程序员
每天工作4小时的程序员
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
如何成为一名黑客
如何成为一名黑客
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
旅行,写作,编程
旅行,写作,编程
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
那些争议最大的编程观点
那些争议最大的编程观点
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
老程序员的下场
老程序员的下场
程序员都该阅读的书
程序员都该阅读的书
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
鲜为人知的编程真相
鲜为人知的编程真相
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员和编码员之间的区别
程序员和编码员之间的区别
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
为什么程序员都是夜猫子
为什么程序员都是夜猫子
10个调试和排错的小建议
10个调试和排错的小建议
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
Java程序员必看电影
Java程序员必看电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
 程序员的样子
程序员的样子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
一个程序员的时间管理
一个程序员的时间管理
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
中美印日四国程序员比较
中美印日四国程序员比较
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
代码女神横空出世
代码女神横空出世
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有