为什么不让用new?内存池又如何?new有什么不好???

menzi11 2011-10-07 12:52:45
谢谢诸位我又问问题来了,那么来说,今天我的问题是这样的.


前一段时间,我认识了一老外,老外看了我写的代码然后对我进行了20T的文字教育
总得来说一个字就是:"不要用new!不要用new!不要用new!!!"


那我就不明白了!!! 为什么不能用new啊???? new怎么了???
不用new难道要我全在栈上编啊!
我的理解里面,不就是怕内存泄露么???new完了我delete不就完了???
我仔细检查不就得了?? 然后又有人告诉我说new完了无论de不delete都
产生碎片啊!! 是不是真的啊?????为什么啊???


然后,我又被说服用内存池,内存池无所谓确实很帅啊,速度很快啊,但是我突然就发现这
new到处都用啊,我用个string难道也往内存池里取内存吗???我发现很多程序里
到处都是new啊,都往内存池里搞吗太麻烦了吧!!





然后跟大家说一下我编的东西啊,我编的东西比较偏门啊,根本不可能需要申请
10m以上的空间啊! 而且根本没有反复来回循着环申请内存的存在啊!
我要做的东西,就是软件启动的时候一共申请个1-10m的内存,然后中途就是大量数学运算,
然后软件退出的时候把这1-10m的内存还给系统就OK了,就这么简单一个东西,
用new到底会不会有碎片啊,用内存池太大材小用了吧.....可是碰巧我这软件的使用者
电脑都挺脆弱的啊,假如new会出一堆碎片那使用者会骂娘的啊



总之,我把问题简化一下,就是:


new这条指令用多了,到底有什么不好(保证delete配对)?我就想用new不想用内存池,
对于我这种小规模的程序,有没有问题啊?如果说对于小程序没问题,那对大程序有没有
问题啊,如果没什么问题,那用内存池到底有什么用啊?
...全文
496 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jha334201553 的回复:]

不如重载malloc。。或者直接自己封装系统的,干嘛封装别人的new类啊
[/Quote]
在C++中,不封装new和delete估计很“蛋痛”的 ---- C++那点优势都没了。
「已注销」 2011-10-08
  • 打赏
  • 举报
回复
不如重载malloc。。或者直接自己封装系统的,干嘛封装别人的new类啊
「已注销」 2011-10-08
  • 打赏
  • 举报
回复
#include <stdio.h>
#define NEWINT(a) new int[a]
#define DELETE(a) { delete a; a = NULL; }

int main(int argc, char* argv[])
{
int *a , *b;
a =NEWINT(50);
printf("0x%08X\n",a);
DELETE(a);

a = NEWINT(50);
printf("0x%08X\n",a);
DELETE(a);

a = NEWINT(20);
printf("0x%08X\n",a);
DELETE(a);

a = NEWINT(100);
printf("0x%08X\n",a);
DELETE(a);

a = NEWINT(50);
b = NEWINT(50);
DELETE(a);
a = NEWINT(100);
printf("0x%08X\n",a);
DELETE(a);
DELETE(b);
return 0;
}

一般来说,new一块内存后delete之后,再new一块同样大小的内存(或者比原先小的内存),那么申请的地址基本上就是原先delete的内存(单线程new情况 或者 只有一个线程会去new的情况),而要new一个比原来delete还要大的内存,那么就不能保证首地址在什么位置了。。。这个在那本黑乎乎的什么书里面有说(这个我还是不要说好了)。系统方面会做优化的,如果是你自己裁剪的系统(把内存管理的代码改了)的话另当别论~~~~~~~
Roy_Smiling 2011-10-07
  • 打赏
  • 举报
回复
存在就有合理,当然也有不合理。
凡是都是相对的。
「已注销」 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hui12345685 的回复:]

如果你是使用对象占用的内存比较大的话
建议可以使用指针,指针只有4个或者8个字节
如果对象不是很大并且没有什么要指向改对象,也不会为该对象创建副本之类的,建议不要使用new
[/Quote]
哦,请问指针所指的空间靠什么分配?走堆栈,遗憾的是在嵌入系统中,堆栈空间比堆空间宝贵多了。况且不是所有情况都可以走堆栈的;

从LZ描述的状况我可以感觉LZ的应用并非我们普通的PC ---- 现在PC都数G内存了,谁还需要考虑内存分配和碎块问题。如果没有说错,LZ的系统是嵌入平台,也许可用内存就几十M而已;
烂番 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 magisu 的回复:]
你怎么能随便用妞呢?

妞都是领导的,领导说让你用你才能用!
[/Quote]

劲屁!!
ww884203 2011-10-07
  • 打赏
  • 举报
回复
来学习的。。。顶一下楼上的高人
hui12345685 2011-10-07
  • 打赏
  • 举报
回复
如果你是使用对象占用的内存比较大的话
建议可以使用指针,指针只有4个或者8个字节
如果对象不是很大并且没有什么要指向改对象,也不会为该对象创建副本之类的,建议不要使用new
vilnies 2011-10-07
  • 打赏
  • 举报
回复
虚心学习,是必须的。
景荣1 2011-10-07
  • 打赏
  • 举报
回复
知其然且要知其所以然,只有这样才能把握“度”,用的恰到好处
景荣1 2011-10-07
  • 打赏
  • 举报
回复
知其然且要知其然
quwei197874 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ri_aje 的回复:]
看楼主的情况,如果在普通的 PC 机上,完全没有必要用内存池,还不够费劲的呢。
退一步说,你就是 new 了不 delete,就这么小的开销,估计你程序退出之前也不会有什么大问题。
没必要迷信老外,要是大牛另说,普通洋人也不会比你多一个脑袋的。
[/Quote]++
acdbxzyw 2011-10-07
  • 打赏
  • 举报
回复
实践出真知。
qq120848369 2011-10-07
  • 打赏
  • 举报
回复
内存池,对象池都是一种优化手段,你觉得合适就用,如果你连怎么实现的也不知道,没必要来发这个帖子.
haofang666777 2011-10-07
  • 打赏
  • 举报
回复
学习了
taodm 2011-10-07
  • 打赏
  • 举报
回复
楼主啊,老外到底教育了你啥啊?
不能因为一个人说new不好,你就信了;然后再一个人跑来说new没问题,你就又用了吧。
zuo187qiang 2011-10-07
  • 打赏
  • 举报
回复
学习..
wo_de_fen_dou 2011-10-07
  • 打赏
  • 举报
回复
来学习的!
机智的呆呆 2011-10-07
  • 打赏
  • 举报
回复
c++内置new操作在某些条件下效率可能很低。
MagiSu 2011-10-07
  • 打赏
  • 举报
回复
你怎么能随便用妞呢?

妞都是领导的,领导说让你用你才能用!
加载更多回复(10)

64,649

社区成员

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

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