问题标签 [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 回答
877 浏览

c++ - std::bad_alloc 从引用地址分配指针

无论出于何种原因,我最终得到的代码看起来像这样

bad_alloc这会在分配点引发异常。为什么?f在非强制转换向量上调用是否重要?这是在 gcc 4.1 上编译的 C++03。

** 编辑 ** 这是在谷歌模拟中运行的一些代码中,我看到了异常。我试图撕下代码并单独编译它,它工作正常。看得更远

** 进一步编辑 ** 所以问题实际上是分配发生在对象的构造函数的最后一行,该对象本身就是另一个对象的成员。父对象的初始化器列表中的下一个对象是异常的来源,但 gdb 让它看起来好像发生在前一个对象的构造函数的最后一行发生了这个赋值。感谢所有的反对票,提醒我这个问题是多么的误导。

0 投票
1 回答
312 浏览

c++ - C++ hash set bad alloc with new

我正在为学校做一个哈希集项目。我有一个用于链接的“LinkedList”类型的数组。我在 Mac 上编写代码并使用 clang++ 编译,一切运行正常(内存泄漏,但我会修复)。我遇到的问题是在使用 g++ 的 Ubuntu Linux 上编译时出现错误的分配错误。在 valgrind 中运行时,它表示条件跳转或移动取决于未初始化的值。并说错误来自以下部分:

我怀疑错误在于构建表格。如果我将大小更改为 5(或任何其他大于 0 的数字),我会得到相同的错误,换句话说,我认为构造大小为 0 的数组不是问题。有想法该怎么解决这个吗?我的 LinkedList 类中没有复制构造函数,表的初始化是调用复制构造函数还是标准默认构造函数?

0 投票
2 回答
1282 浏览

c++ - 永远不要将涉及动态内存分配的函数注释为 noexcept?

假设您有一个通常永远不会失败的函数,例如:

原则上,这将是noexcept. 但是,实现很可能涉及动态内存管理,因此在使用运算符分配内存时,它总是会抛出std::bad_allocnew

是否建议将函数注释为 noexcept?

从实际的角度来看,以合理的方式处理内存不足的情况是极其困难的。大多数程序只是假设有足够的可用内存。std::terminate如果noexcept函数 throws会发生调用,std::bad_alloc在这种情况下似乎是合理的。

对我来说noexcept是某种形式的文档。这是您(或优化器)可以安全地假设此函数永远不会抛出的承诺。如果您正在编写一个不关心内存不足情况的应用程序,那么它仍然是一个有效的假设。

我想最安全的建议是永远不要使用noexcept如果std::bad_alloc可以抛出异常。另一方面,我想知道如果noexcept您不关心内存不足的情况(即,如果std::terminate可以的话),是否有任何优势可以使用。

0 投票
1 回答
1072 浏览

c++ - 带指针的内存分配失败

我搜索了著名的“std::bad_alloc”错误,但找不到像我这样的案例。我已经用 c++ 实现了一个代码(准确地说:在 Win 7 Prof. 中使用 Eclipse 在 MinGW 中运行)并且代码对于少量的类实例运行良好,但是当类实例的数量超过 10509 时,错误来自windows 出现,然后 eclipse 显示 'std::bad_alloc' 错误。我正在使用“new”来构建新的类实例,每个类都需要两个指针和三个“long int”、“string”和“int”类型的变量。我无法解构之前构建的任何实例,因为稍后我需要将它们作为节点在程序的其他部分进行评估。但是,无论如何我已经将类解构器添加到类定义中,并且它们确实设置正确。

所以我想知道是否可以扩展保留的内存来分配新的类实例?

代码太长,这里就不贴了。感谢您的任何帮助!

0 投票
1 回答
2899 浏览

c++ - bad_alloc 标识符无法识别?

我收到编译器错误:

错误 C2061:语法错误:标识符“bad_alloc”

我之前在其他项目中使用过下面的代码块,在 try 块中分配了不同的内存,没有问题。我希望有人可以向我解释为什么 bad_alloc 没有被 VS10 识别,尽管它在其他程序中使用时没有引起同样的问题?很可能我错过了一些小的语法问题,但我花了几个小时试图弄清楚,此时我觉得我可能对错误视而不见。谢谢您的帮助!

0 投票
5 回答
17538 浏览

c++ - C++ 向量 std::bad_alloc 错误

我试图在 C++ 中实现一个后缀树,同时将节点添加到我的向量列表中,它在向树中添加第三个元素后抛出 std::bad_alloc 。我不知道为什么它在第三次之后发生,你能帮我解决这个 bad_alloc 错误吗?

这是我的代码:

suffix_tree.cpp

节点.cpp

节点.h

生成文件

提前致谢。

0 投票
1 回答
1217 浏览

c++ - 使用 dbx 在 AIX 上捕获 C++ 异常

我有一个 C++ 应用程序,它以 AIX 机器上的某些输入数据的“错误分配”错误消息终止。

有没有办法在 dbx 中运行程序并在抛出异常时捕获异常?我在 IBM 的文档中没有看到任何关于它的内容。

0 投票
1 回答
1628 浏览

c++ - C++ bad_alloc 是由 new 引起的吗?

[前注:我已阅读 StackOverflow 中的现有线程。我的问题似乎没有]

我正在研究 Quake 2 MD2 格式。在新建一个指针数组后,我似乎得到了一个错误的分配。但是,如果我做了一些可怕的指针操作,一切都很好。我想问题是,为什么我会遇到这样的异常?

第一个“MD2Model::Load”有效。我在收到异常后发布的那个。

基本结构:

现在,读取 .md2 文件的函数:

调试期间转储的变量:

(我最终删除了我的 D3DXVECTOR3 结构来查看,所以它有点丑……)

好吧。所以,在“for”循环内部,就是它爆炸的地方。如果我要这样做:

在分配“m_pFrames[i].pVerts”语句期间,我得到了 bad_alloc 异常。有时,我不明白,但当我尝试新的 D3D 类时,我确实得到了例外(我假设无论我之后的新内容我都会得到它)。我的 MEM 使用率极低,会不会是堆损坏?

实际上,我在动画期间创建 VertexBuffer 时也不得不这样做。

我应该最终使用向量吗?我知道他们分配的比需要的多,但这似乎是(最明显的)[最佳]方式。

0 投票
2 回答
1152 浏览

c++ - std::map::begin() 返回带有垃圾的迭代器

调试器监视

在创建 const_iterator termWeight 时出现问题:

正如您在上图中所见, termWeight const_iterator 包含无效数据。但是,const std::map 文档是完全有效的 std::map。我想不出为什么会发生这种情况。

我最近了解到 std::map::cbegin() 存在。我应该改用那种方法吗?

编辑:包括更多上下文

0 投票
1 回答
1627 浏览

c++ - C++ 使用 std::sort 为非常小的 std::vector 抛出 std::bad_alloc 异常

我正在处理一个处理逗号分隔数据 (CSV) 的 C++ 项目。我所做的是将 .csv 文件中的数据读取到 CsvRow 对象的向量中。
所以,今天我遇到了一个非常奇怪的 std::bad_alloc 异常,它在更奇怪的情况下被抛出。即,我设法获得更多时间直到引发异常的第一个测试用例是将整个 csv 文件读入向量。该文件由 500,000 行组成,大小约为 70MB。该文件像魅力一样被读入内存,但在排序过程几秒钟后,std::bad_alloc 被抛出。它使用了大约 67MB 的 RAM 注意:我正在使用 boost 的 flyweights 以减少内存消耗。

但是,这个测试用例更奇怪:我正在读取一个有几百行的 146KB 文件,这次我在将数据读入向量时遇到了异常,这完全是荒谬的,之前成功读取了 70MB。

我怀疑内存泄漏,但我的机器有 8GB 的​​ RAM,使用 64 位 Windows 8。我正在使用 CodeBlocks 和 MinGW 64 位升压发行版。任何帮助,将不胜感激。这是一段代码,其中 std::bad_alloc 被抛出:

  1. 从 csv 文件中读取数据

    /li>
  2. 使用存储在我的类中的内部结构对向量进行排序

    /li>

然后,我std::sort()用来对 CsvRows 的向量进行排序

这条线看起来很可疑,但我想不出一种更简单的方法来初始化这些哈希集。

在析构函数中删除这些哈希集会使程序崩溃(SIGSEGV)哦,还有一点需要指出的是,由于我的 MinGW 是 64 位,我不能使用默认的 32 位 gdb 调试器。32 位 gdb 存在错误,无法与 MinGW 64 一起使用。

编辑:
boost::flyweight<std::string> 在 CsvRow 类中使用的会导致问题吗?

除此之外,这是该CsvRow课程的一部分:

以及类上的重载[]运算符CsvRow

提前致谢

编辑 - 已解决: 所以,这个问题解决了我的问题,虽然我什至没有想到。我们传递给的每个自定义比较器std::sort() 都必须是严格的弱排序,即:
1. 非自反
2. 不对称
3. 传递
性 4. 不可比性的传递性

更多信息:This question and This Wiki article
实际上,我没有遵循第一个(非自反性),也就是说,如果两个CsvRow对象相等,它不应该“比较”它们并返回true好像它们没问题,但是而是返回falseCsvRow a我通过仅在两者和CsvRow b相等时更改默认返回值来解决整个问题。

感谢所有试图提供帮助的人。请记住此解决方案,以防您遇到类似问题。这很棘手。