c++ - 用 new 分配大块内存

标签 c++ memory new-operator bad-alloc

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

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

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

我的情况是 64 个 288000 字节的 block 。有时我要分配 12 个,而其他时候我要分配 27 个。我得到一个 std::bad_alloc 异常。

这是:C++、Linux 上的 GCC(32 位)。

最佳答案

关于C++/GCC/Linux(32bit)中的new...

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

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

这可能是共享计算机上的问题,当您的同事出现缓慢的内核泄漏时。尤其是当他开始淘汰系统进程时。

因此,您看到 std::bad_alloc 异常的事实是“有趣的”。

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

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

您是否尝试过运行“免费”程序?你有足够的可用内存吗?

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

您的代码到底是什么样的?我猜新的 ClassFoo [ N ]。或者也许 new char [ N ].

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

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

或者,您是否与自定义 new 分配器链接?你的类(class)有自己的分配器吗?

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

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

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

你能创建一个简单的测试程序吗?仅仅几行代码就可以重现该错误?还是您的问题在其他地方,只出现在这里?

--

对于它的值(value),我在 g++ 下的 32 位 linux 中使用 new 分配了超过 2gig 的数据 block 。您的问题出在其他地方。

关于c++ - 用 new 分配大块内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/590362/

相关文章:

c++ - ld.so.1 : protoc: fatal: libstdc++. so.6:在 Solaris 11 中找不到版本 'GLIBCXX_3.4.20'

java - 内存计算器程序

c++ - 为什么我需要调用新人?

c++ - 在使用 new (c++) 的构造函数调用中不使用括号

c++ - 发送给单个接收者的多个 UDP 消息

c++ - 创建对象 vector 时,如何将参数传递给 Default 或 Copy Constructor 以初始化值?

c++ - 在 C++ 中检测运算符是否存在和可调用(考虑 static_asserts)

python - Django QuerySet - 内存使用/惰性

c - 模拟 'strings' UNIX 命令的 C 程序运行时崩溃

c# - C#中的关键字实现