带指针的内存分配失败

Posted

技术标签:

【中文标题】带指针的内存分配失败【英文标题】:Memory allocation failure with pointers 【发布时间】:2013-09-15 14:42:40 【问题描述】:

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

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

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

【问题讨论】:

如果可能,请使用 pastebin.com 粘贴代码。 欢迎来到 Stack Overflow。请尽快阅读About 页面。现在你会看到更多的人看到它被标记为“C++”。如果内存不足,主要有两种可能性:(1)您没有足够的可用内存,或者(2)您超出了分配的内存范围并混淆了系统。在第二种情况下,您需要一个内存滥用检测器;在 Linux 上,我会将您指向 valgrind,但这不适用于 Windows AFAIK。在第一种情况下,您需要减少为每个类分配的内存量。或者增加可用内存。 另外请注意,如果您提出一般性问题并且无法发布详细信息,那么您的问题可能不适合 Stack Overflow。它可能“过于宽泛”或需要“基于意见”的答案。 请注意,虽然抛出 std::bad_alloc 的典型原因是内存耗尽,但如果堆使用的数据结构已损坏(例如,被野内存覆盖),也可能发生这种情况,例如堆的分配器函数被愚弄认为内存无法分配。如果是这种情况,那么解决方案是调试在抛出 bad_alloc 之前执行的代码,以便堆数据结构不会损坏。 【参考方案1】:

首先,new 工作的动态内存通常会占用进程中所有剩余的可用内存。没有办法进一步扩展它。你最初有多少动态内存取决于你的程序有多少非动态数据。如果不了解您的程序,就没有办法说。通过减少非动态数据的大小,您可以有效地“扩展”可用作动态内存的数据。

其次,在具有虚拟内存的平台上,实际上不可能“内存不足”(假设您有一个健康的交换文件)。但是您可能会用完进程地址空间。同样,如果您在仅分配 10509 对象后耗尽了地址空间,那么肯定是有其他问题。

第三,10509 看起来是一个非常小的数字。因此,如果在分配这么少的对象后内存不足,则可能意味着对象本身相当大。你的对象有多大?

第四,动态内存分配错误可能由堆损坏触发,这意味着即使技术上仍有大量可用内存可用,分配也会失败。如果不了解您的代码,就没有办法说。

【讨论】:

以上是关于带指针的内存分配失败的主要内容,如果未能解决你的问题,请参考以下文章

带指针的函数

malloc函数分配内存失败的常见原因

内存动态分配与释放

C 语言二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

动态内存分配

new/malloc的差别