当前位置:  开发笔记 > 编程语言 > 正文

使用new分配大块内存

如何解决《使用new分配大块内存》经验,为你挑选了1个好方法。

我需要用new分配大块内存.

我坚持使用new,因为我正在为两部分应用程序的生产者端编写一个模拟器.实际的生产者代码正在分配这些大块,我的代码有责任删除它们(在处理它们之后).

有没有办法可以确保我的应用程序能够从堆中分配如此大量的内存?我可以将堆设置为更大的尺寸吗?

我的情况是64块288000字节.有时我得到12分配,有时我得到27分配.我得到一个std :: bad_alloc异常.

这是:C++,Linux上的GCC(32位).



1> Mr.Ree..:

对于的C++/GCC/Linux操作系统(32位)...

它已经有一段时间了,它依赖于实现,但我相信新的意愿,在幕后调用malloc(). Malloc(),除非您要求超出进程地址空间或超出指定(ulimit/getrusage)限制的内容,否则不会失败.即使您的系统没有足够的RAM + SWAP.例如: 我认为,具有256Meg RAM + 0 SWAP的系统上的malloc(1gig)将成功.

但是,当您使用该内存时,内核通过延迟分配机制提供页面.此时,当您第一次读取或写入该内存时,如果内核无法为您的进程分配内存页面,则会终止您的进程.

当您的同事核心泄漏缓慢时,这可能是共享计算机上的问题.特别是当他开始淘汰系统进程时.

所以你看到std :: bad_alloc异常的事实是"有趣的".

现在new将在分配的内存上运行构造函数,在返回之前触及所有这些内存页面.根据实现情况,它可能会捕获内存不足的信号.

你用普通的malloc试过这个吗?

你试过运行" 免费 "程序吗?你有足够的内存吗?

正如其他人所建议的那样,您是否检查过limit/ulimit/getrusage()是否存在硬约束和软约束?

你的代码到底是什么样的?我在猜新的ClassFoo [N].或者也许是新的字符[N].

什么是sizeof(ClassFoo)?什么是N

对于大多数现代机器来说,分配64*288000(17.58Meg)应该是微不足道的...您是在嵌入式系统上运行还是其他特殊的东西?

或者,您是否使用自定义分配器进行链接?你的班级有自己的分配器吗?

您的数据结构(类)是否将其他对象分配为其构造函数的一部分?

有人篡改了你的图书馆吗?你有多个编译器安装?您使用错误的包含或库路径吗?

你是否链接过时的目标文件?您只需要重新编译所有源文件吗?

你能创建一个简单的测试程序吗?只需几行代码即可重现错误?或者你的问题在其他地方,只出现在这里?

-

值得一提的是,我已经在g ++下用32bit linux中的数据块分配了超过2gig的数据块.你的问题在别处.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有