问题标签 [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 投票
1 回答
201 浏览

c++ - 有没有等到内存可用的新方法?

在阅读这个问题之前,我从未认真对待异常处理。现在我看到了必要性,但仍然觉得“编写异常安全代码非常困难”。

请参阅该问题接受的答案中的此示例:

正如答案所说,我可以通过使用轻松提供基本保证std::unique_ptr。但是,当我捕获 a 时std::bad_alloc,我不知道它是否发生在push_backorx->doSomethingThatCanThrow()中,所以我不知道 t.list 是否仍然“好”或者它的最后一个元素没有完全准备好。然后唯一的选择是丢弃 t,显示一个可怕的消息并中止,如果 t 对整个程序是必不可少的。

具有强保证的代码没有问题,但是“它可能会变得昂贵”(这个例子涉及到大列表的副本),并且不那么可读。

一个可能的解决方案可能是new等待内存可用,从而消除最烦人的异常std::bad_alloc。然后 2. 和 3. 不会抛出(前提X是构造和复制总是成功)。我可以将 4. 包装在一个 try 块中并在此处处理异常(以及 pop_back 列表)。然后该函数将提供 nothrow 保证,并且列表将始终包含好东西。

用户不会关心 100% CPU 和 100% RAM 之间的区别。当他们看到一个程序挂起时,他们会关闭其他程序,以便new找到足够的内存并继续。

我的问题:这可以实施吗?有没有等到内存可用的新方法?我可以在全球范围内应用它(例如 by #define new ...),以便 C++ 标准化之前的库可以在临时 100% RAM 中存活吗?

0 投票
0 回答
682 浏览

c++ - gdb“参数结束时的垃圾。” 尝试“catch throw std::bad_aloc”时

我一直在尝试在 gdb 中调试 std::bad_alloc 的实例。

在 gdb 7.4.1 和 7.5.91 我试过

我尝试将 std::bad_alloc 用单引号和双引号括起来,但没有成功。

是否有解决方法,或者有其他方法来捕获 bad_alloc?

编辑:只是说我尝试了一个相关问题的建议,通过这样做来打破 bad_alloc 的构造函数

但是没有找到这个断点。

0 投票
1 回答
790 浏览

c++ - 使用删除内部函数

我在函数内部调用 delete 时遇到问题。当我使用新的内部函数分配内存时,它似乎确实有效,但删除以前分配的内存会导致抛出 std::bad_alloc。是否有可能,或者我只能从 main 内部释放“a”下的内存?

0 投票
0 回答
250 浏览

c++ - 对象复制视觉工作室错误弹出:std::bad_alloc

我想将页面内容复制到另一个 Page 对象。但是它有错误,我认为它与内存分配有关。具体原因我没有找到。有人解释一下原因吗?我附上了应对对象的源代码部分。感谢

mlock.c 文件错误点 void __cdecl _unlock (int locknum) { /* * 离开临界区。*/ LeaveCriticalSection(_locktable[locknum].lock); } Microsoft C++ 异常:std::bad_alloc(内存位置 0x002afa90)

0 投票
1 回答
3892 浏览

c++ - 错误的分配被抛出

在尝试使用 boost 托管共享内存时,我得到了一个 'bad_alloc。我已经从他们为不耐烦的人的快速指南中复制了 boost 示例,并合并了我自己的更改。我的代码在下面,我已经注释掉了示例内容并在下面写了我自己的。我还投入了一些调试和测试的东西。

有没有人有任何想法?任何帮助是极大的赞赏!

-M

}

这是我的程序输出...

0 投票
1 回答
2014 浏览

c++ - 奇怪的 std::bad_alloc

据我所知,可以抛出 std::bad_alloc 有三个原因:

  1. 进程请求的内存超过了可以提供的内存
  2. 地址空间过于碎片化,无法满足对大块连续内存的请求
  3. 堆管理数据结构已损坏

我们有运行到 std::bad_alloc 的代码,但上述原因似乎都不适用。数据结构是一个存储为顶点的 std::list 的图,其中每个顶点再次存储一个 std::list,它是它的一部分以及一些连续数据的一部分。

对于小图(<= 100'000 个顶点),程序运行得非常好,不管每个顶点的数据部分有多大(我们可以毫无问题地总共分配 40 GB)。但是,如果顶点数变大,即使在“仅”使用 8 GB 内存的实例上也会抛出 std::bad_alloc 异常。

由于在较大的块中分配更多的内存没有问题,因此应排除上述原因1.和2.。有些部分我们以非常容易出错的方式使用指针,因此我们可能会破坏堆数据结构。但是当在较小的实例上运行时,valgrind 的 memcheck 报告我们的代码完美无缺,所以这个原因似乎也不太可能(在抛出实例时,valgrind 本身内存不足,所以我们不能直接检查这种情况)。

对于这种行为的其他原因,或者我们可能会运行哪些测试来进一步确定问题,是否有任何想法?

操作系统:Fedora 19
构建系统:cmake 和 gcc 4.8.2

0 投票
1 回答
7558 浏览

c++ - `std::vector` 在调整大小时抛出“错误分配”异常

我在通过 JNI 调用的 C++ dll 中有以下代码:

我得到一个“错误分配”异常,即使向量的最大大小应该大于 10000000。

为了定位任何内存泄漏,我应该使用什么工具来跟踪内存分配?

如果真的没有内存泄漏,如何减少向量的占用空间以确保我有足够的空间?

0 投票
0 回答
596 浏览

c++ - 智能指针的 std::bad_alloc 问题

我正在尝试使用智能指针对课程作业的潜在大数据元素进行排序和重新链接。我在代码中为智能指针定义了一个类,如下所示:

我要排序的对象是一个单链表,其中包含带有个人记录(即姓名、电话号码等)的类对象。单链表类中有一个迭代器类,如下所示。

以下是我在列表类中使用智能指针“排序”的函数。

tl; dr,我必须在某处分配错误的智能指针,因为此代码可以编译,但是当我运行它时,std::bad_alloc 与核心转储一起发生。我在哪里泄漏内存?在此先感谢您的帮助!

PS,我已经在这里进一步研究了智能指针,如果这个实现不是分配的要求,我只会使用标准库的智能指针。另外,我知道我对 std::sort(begin, end) 的调用已被注释掉,但我不想开始排序,直到我将智能指针放在正确的位置。

0 投票
0 回答
159 浏览

c++ - 从向量中检索的 std::bad_alloc

(我以前从来没有在这里问过问题,所以如果我不遵守适当的礼仪请见谅)

我正在研究用于 GLWidget 的场景图,并且遇到了一个奇怪的 bad_alloc 案例。我的场景图中的每个节点(称为 graphNode)都有以下字段:

(myPolygon 是我创建的用于存储顶点和颜色数据的自定义多边形类)

我的 SceneGraph 类具有以下字段:

当我尝试构建 allNodes 时会发生 bad_alloc。我的根 ndoe 有 5 个孩子,如果我使用 std::cout 打印孩子向量的大小,我会得到 5。但是,当我尝试将每个孩子推送到 allNodes 时,我得到一个 std::bad_alloc 错误。QT 中的确切应用程序输出是

我不确定我做错了什么,特别是因为程序认识到孩子的存在(当我逐步使用打印语句和调试器时,我可以看到孩子都是我所期望的。任何非常感谢您的帮助,如果我需要提供我的代码,我将非常乐意这样做。

编辑:既然有人问,基本上我有一些代码可以创建一个字符,如下所示:

节点根:名称“根”多边形 = 躯干图的矩形节点* 父级 = 5 个子级的 NULL 向量 [Head, Arm1, Arm2, Leg1, Leg2]

节点头:名称“头”多边形=头部的圆圈 graphNode* parent = root 一个空的子向量

节点 Arm1 名称“arm1”多边形 = 上臂的矩形 graphNode* parent = 1 个子节点的根向量 [Forearm1]

节点 Arm2 名称“arm2”多边形 = 上臂图形节点* 父级 = 1 个子级的根向量 [Forearm2]

节点 Leg1 名称“leg1”多边形 = 大腿的矩形 graphNode* parent = 1 个子节点的根向量 [Loweleg1]

节点 Leg2 名称“leg2”多边形 = 大腿的矩形 graphNode* parent = 1 个子节点的根向量 [Loweleg2]

节点 Forearm1 名称 "forearm1" 多边形 = 前臂图形节点的矩形节点 * parent = Arm1 一个空的子向量

节点 Forearm2 名称 "forearm2" 多边形 = 前臂 graphNode* parent = Arm2 一个空的子向量的矩形

节点 Lowerleg1 名称 "lowerleg1" 多边形 = 小腿的矩形 graphNode* parent = Leg1 一个空的子向量

节点 Lowerleg2 名称 "lowerleg2" 多边形 = 小腿矩形 graphNode* parent = Leg2 一个空的子向量

0 投票
1 回答
110 浏览

c++ - 涉及 C++ 中图的大型测试用例(使用 STL)抛出 std::bad_alloc

我们正在研究一个图(存储为邻接表实现)算法实现,它需要我们存储以下内容:

  1. 二维 n 到 n 距离矩阵(存储为浮点数组)
  2. 每对顶点之间的最短路径数(存储为整数数组)。
  3. 对于所有可能的源选择,每个顶点的前辈都将给定顶点作为源顶点。这是 O(n*n*k),其中 k 是源顶点的所有可能选择中所有顶点的平均前导数。在最坏的情况下,这可能是 O(n^3) 空间。然而,前辈的平均数量可能很小。(k 是一个常数)。Predecessor 存储为两级映射,前驱列表存储为 STL 向量。

我们尝试在大图(>2^12 个顶点)上进行测试,运行一段时间后会抛出 std::bad_alloc。即使在仅使用 3GB 内存的 8GB(Ubuntu 12.04)或 16GB 上运行时也是如此。你能告诉我们如何让大型测试用例工作还是我们在某个地方出错了?