C++在一个对象中动态分配一个很大的数组会提示内存分配失败,那我可以提高给对象分配的内存空间吗?

 我来答
匿名用户
2016-03-31
展开全部
C++ new出来的物理、逻辑内存都是连续的,如果一次申请很大的内存,可能会失败,不是没有内存,而是没有那么大的内存;
建议改用链表,这样避免空闲内存块不够大;
另外在有些Unix系统中,10个1M内存和1个10M内存释放速度不一样;
建议不要一次申请一个很大内存。
追问
我的对象在一个循环中,第一次能申请成功,第二次就不行了,每一个new[]都有一个对应的delete[]
追答
既然用了C++,有链表何必把麻烦留给自己呢,循环嵌套new一不小心可能造成内存没释放,链表不会有这个问题的。方便可靠,对于写程序来说同样的功能代码简介、可靠才是重要的。对了要用list而不是vector,list封装了C链表内存不连续,vector封装了C数组内存依然连续
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kyotrue
2016-03-31 · TA获得超过1.5万个赞
知道大有可为答主
回答量:2.3万
采纳率:75%
帮助的人:6795万
展开全部
Windows 32位程序,用户地址空间只有2GB,而且由于地址分配的碎片化,你要想分配一个连续的1GB地址都难,512MB有时候都只能申请一次就没法成功了。

有两种方法:
1、使用AWE机制来访问内存,这个可以超过32位程序的2G地址空间限制,建议采用此方法。
2、申请多个128MB的Buffer,组成你需要的大内存段
追问
我的对象是在一个循环里面,这个对象中用new[]开辟的空间,用完之后又用delete[]。结果循环第二次new分配就失败了
追答
你这个现象,就是产生了内存地址的碎片啊。比如你一次申请1GB内存,就算剩余的地址空间有1.5GB,但如果里面没有连续1GB以上的,你直接new一个也是申请不成功的,因为new出来的一定需要是连续的地址。

如果new完马上delete再new,照理说就不该失败的,除非有里面其他的地址申请了没有释放。

Windows下,超过256MB的内存段,不建议直接new,建议用AWE,AWE是你可以只用一段很小的地址空间去动态映射无限大的内存。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
斗逗小兜
2016-03-31 · 超过13用户采纳过TA的回答
知道答主
回答量:81
采纳率:0%
帮助的人:34万
展开全部
这个样子是可以的
追问
那怎么弄呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式