问题标签 [bad-alloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
6434 浏览

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

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

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

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

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

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

0 投票
2 回答
2782 浏览

c++ - 如何解决这个 bad_alloc 问题?

我正在开发一个需要通过 FTP 进行交互的应用程序。对于这种交流,我目前在 Windows 上使用 C++、Visual Studio 和 Poco。

以下行导致 bad_alloc 异常...

所以我下去尝试先初始化一个StreamSocket,也失败了......

当走得更远时,bad_alloc 似乎来自:

该构造函数包含:(我在调试器中看到 _pImpl 未初始化)

IPv4AddressImpl::parse 包含:

以下带有来自 Winsock2.h (ws2_32.lib) 的 inet_addr 的代码会导致“SOMETHING ELSE”。

我看不出这里出了什么问题......有没有办法进一步调试这个问题或者有人知道出了什么问题?

0 投票
2 回答
1167 浏览

c++ - Linux 上的运算符 new 和 bad_alloc

在 Linux 上,如果内存不足,malloc 不一定会返回空指针。如果你真的内存不足,你可能会取回一个指针,然后让 OOM 杀手开始吃进程。c++ 的运算符 new 是否也是如此,还是会得到 bad_alloc 异常?

0 投票
4 回答
2542 浏览

c++ - Win32 上的内存不足 (?) 问题(与 Linux 相比)

我有以下问题:

在 Windows 机器上运行的程序(32 位,3.1Gb 内存,VC++2008 和 mingw 编译代码)失败并bad_alloc抛出异常(在分配大约 1.2Gb 后;尝试分配 900 万双精度向量时抛出异常,即大约 75Mb)还有大量可用的 RAM(至少根据任务管理器)。

在 Linux 机器(32 位、4Gb 内存;32 位、2Gb 内存)上运行的相同程序运行良好,峰值内存使用量约为 1.6Gb。有趣的是,由 mingw 生成的 win32 代码在 wine 下的 4Gb linux 机器上运行也因 bad_alloc 而失败,尽管在 Windows 下运行时在不同的(稍后)位置...

可能的问题是什么?

  • 堆碎片?(我怎么知道?这怎么解决?)
  • 堆腐败?(我已经在启用 pageheap.exe 的情况下运行了代码,没有报告任何错误;实现了带边界检查的向量访问 --- 再次没有错误;代码基本上没有指针,只使用了std::vectors 和std::lists。在 Valgrind 下运行程序( memcheck) 消耗过多内存并提前结束,但没有发现任何错误)
  • 记不清???(应该有足够的内存)

此外,在 linux 版本运行时(甚至在内存较少的机器上),windows 版本失败的原因可能是什么?(另请注意,/LARGEADDRESSAWARE 链接器标志与 VC+2008 一起使用,如果这可以产生任何影响)

任何想法都将不胜感激,我对此束手无策...... :-(

0 投票
3 回答
20532 浏览

c++ - 如何在 C 中调试 gdb 中的 St9bad_alloc 故障?

我有一个程序失败:

我想这与malloc/有关free,但我不知道是哪一个。

我可以在 gdb 中设置哪些断点来中断错误,以便我可以查看堆栈跟踪?

该程序是 C 和 C++ 的组合,使用 gcc 3.4.2 编译。

0 投票
4 回答
340 浏览

c++ - 分配数组时运算符 new 的问题

我的 C++/openGL 程序有问题。

在某些代码点,比如这些(它是一个构造函数):

新的抛出一个 std::bad_alloc 异常。在另一个地方也是一样。有没有可能,我的内存用完了?我不这么认为,所以如果你能帮助我,我会很高兴!再见!

0 投票
4 回答
178 浏览

c++ - 尝试打印值时出现 bad_alloc 异常

我已经将我的另一个问题调试回MyMesh构造函数。在这段代码中:

我正在为网格确定必要的 SurfacePoints 和 Triangles。布尔“空心”和“平滑”表示,如果我需要在圆锥体上打一个洞,或者法线是否相同,但我认为这无关紧要。

问题是:如果hollow==false,它会做错事,但不会崩溃,它甚至允许将值放入数组中,但是当我试图像这样计算它时:

它会在 i=0 时引发 bad_alloc 异常。

此外,曾经有一段时间,上面的代码段向 operator new 抛出了一个 bad_alloc,但这个问题自己解决了,但也许它是相关的。

有谁能够帮我?

0 投票
6 回答
26729 浏览

c++ - 查找bad_alloc原因的调试策略

我的程序中有一个相当严重的错误——偶尔调用 new() 会抛出一个 bad_alloc。

从我可以在 bad_alloc 上找到的文档中,它似乎是由于以下原因而抛出的:

  1. 当计算机内存不足时(这绝对没有发生,我有 4GB 的 RAM,当使用少于 5MB 的内存(在任务管理器中检查)时程序抛出 bad_alloc,而后台没有任何严重的运行)。

  2. 如果内存变得太碎片化而无法分配新块(这同样不太可能 - 我曾经分配的最大块大小约为 1KB,并且在崩溃发生之前不会超过 100 次)。

根据这些描述,我真的没有任何地方可以抛出 bad_alloc。

但是,我正在运行的应用程序运行多个线程,这可能是导致问题的原因。通过在单个线程上测试所有对象,一切似乎都很顺利。我能想到的唯一另一件事可能是同时在多个地方调用 new() 引起的某种竞争条件,但我尝试添加互斥锁以防止这种行为没有效果。

因为程序有几百行,而且我不知道问题出在哪里,所以我不确定要发布什么(如果有的话)代码片段。相反,我想知道是否有任何工具可以帮助我测试这种事情,或者是否有任何通用策略可以帮助我解决这个问题。

我正在使用 Microsoft Visual Studio 2008 和 Poco 进行线程处理。

0 投票
3 回答
4439 浏览

c++ - 为什么我的程序在内存不足而不是抛出 std::bad_alloc 时偶尔会出现段错误?

我有一个程序,它实现了几种启发式搜索算法和几个域,旨在通过实验评估各种算法。该程序用 C++ 编写,使用 GNU 工具链构建,并在 64 位 Ubuntu 系统上运行。当我运行我的实验时,我使用 bash 的ulimit命令来限制进程可以使用的虚拟内存量,这样我的测试系统就不会开始交换。

某些算法/测试实例组合达到了我定义的内存限制。大多数时候,程序会抛出一个 std::bad_alloc 异常,该异常由默认处理程序打印,此时程序终止。有时,程序不会发生这种情况,而是会出现段错误。

为什么我的程序在内存不足时偶尔会出现段错误,而不是报告未处理的 std::bad_alloc 并终止?

0 投票
4 回答
2485 浏览

c++ - 将 new 用于 struct c++ 时出现 Bad_alloc 异常

我正在编写一个查询处理器,它分配大量内存并尝试查找匹配的文档。每当我找到匹配项时,我都会创建一个结构来保存描述文档的两个变量并将其添加到优先级队列中。由于无法知道我会这样做多少次,我尝试使用 new 动态创建我的结构。当我从优先级队列中弹出一个结构时,队列(STL 优先级队列实现)应该调用对象的析构函数。我的结构代码没有析构函数,所以我假设在这种情况下会调用默认析构函数。

但是,我第一次尝试创建 DOC 结构时,出现以下错误:

QueryProcessor.exe 中 0x7c812afb 处的未处理异常:Microsoft C++ 异常:内存位置 0x0012f5dc 处的 std::bad_alloc..

我不明白发生了什么 - 我是否用尽了太多内存以至于堆已满?似乎不太可能。而且好像我以前什至没有使用过那个指针。

所以:首先,我在做什么导致错误,其次,以下代码会多次工作吗?我是否需要为每个创建的结构创建一个单独的指针,或者我可以重复使用相同的临时指针并假设队列将保留一个指向每个结构的指针?

这是我的代码:

非常感谢,bsg。