我需要用new分配大块内存.
我坚持使用new,因为我正在为两部分应用程序的生产者端编写一个模拟器.实际的生产者代码正在分配这些大块,我的代码有责任删除它们(在处理它们之后).
有没有办法可以确保我的应用程序能够从堆中分配如此大量的内存?我可以将堆设置为更大的尺寸吗?
我的情况是64块288000字节.有时我得到12分配,有时我得到27分配.我得到一个std :: bad_alloc异常.
这是:C++,Linux上的GCC(32位).
对于新的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的数据块.你的问题在别处.