C++在一个对象中动态分配一个很大的数组会提示内存分配失败,那我可以提高给对象分配的内存空间吗?
3个回答
2016-03-31
展开全部
C++ new出来的物理、逻辑内存都是连续的,如果一次申请很大的内存,可能会失败,不是没有内存,而是没有那么大的内存;
建议改用链表,这样避免空闲内存块不够大;
另外在有些Unix系统中,10个1M内存和1个10M内存释放速度不一样;
建议不要一次申请一个很大内存。
建议改用链表,这样避免空闲内存块不够大;
另外在有些Unix系统中,10个1M内存和1个10M内存释放速度不一样;
建议不要一次申请一个很大内存。
追问
我的对象在一个循环中,第一次能申请成功,第二次就不行了,每一个new[]都有一个对应的delete[]
追答
既然用了C++,有链表何必把麻烦留给自己呢,循环嵌套new一不小心可能造成内存没释放,链表不会有这个问题的。方便可靠,对于写程序来说同样的功能代码简介、可靠才是重要的。对了要用list而不是vector,list封装了C链表内存不连续,vector封装了C数组内存依然连续
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Windows 32位程序,用户地址空间只有2GB,而且由于地址分配的碎片化,你要想分配一个连续的1GB地址都难,512MB有时候都只能申请一次就没法成功了。
有两种方法:
1、使用AWE机制来访问内存,这个可以超过32位程序的2G地址空间限制,建议采用此方法。
2、申请多个128MB的Buffer,组成你需要的大内存段
有两种方法:
1、使用AWE机制来访问内存,这个可以超过32位程序的2G地址空间限制,建议采用此方法。
2、申请多个128MB的Buffer,组成你需要的大内存段
追问
我的对象是在一个循环里面,这个对象中用new[]开辟的空间,用完之后又用delete[]。结果循环第二次new分配就失败了
追答
你这个现象,就是产生了内存地址的碎片啊。比如你一次申请1GB内存,就算剩余的地址空间有1.5GB,但如果里面没有连续1GB以上的,你直接new一个也是申请不成功的,因为new出来的一定需要是连续的地址。
如果new完马上delete再new,照理说就不该失败的,除非有里面其他的地址申请了没有释放。
Windows下,超过256MB的内存段,不建议直接new,建议用AWE,AWE是你可以只用一段很小的地址空间去动态映射无限大的内存。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个样子是可以的
追问
那怎么弄呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询