【问题标题】:C++ loop memory error?C++循环内存错误?
【发布时间】:2013-05-04 21:37:07
【问题描述】:

我在这里有一些代码,其中有一组“培根”对象。我可以编译并运行它并将对象添加到数组中,但是当我使数组大小超过一百万时,我运行它并显示“bacon.exe 已停止工作”,我必须关闭它。我认为这可能是内存泄漏,但我仍在学习。我正在使用netbeans ide,我尝试在编译时分配更多内存,但我不知道该怎么做。注意:这不是因为我的整个计算机内存不足,因为我运行程序后还有 2GB 可用空间。这是我的代码:

#include <iostream>
#include "Bacon.h"
using namespace std;

int main() {
    const int objs = 1000000;
    Bacon *bacs[objs];
    for(int i = 0;i < objs;i++){
        bacs[i] = new Bacon(2,3);
    }
        for(int i = 0;i < objs;i++){
        bacs[i]->print();
    }
    cin.ignore();
    return 0;
}

【问题讨论】:

  • “生成错误”不是很有帮助 - 究竟是什么错误?
  • @PaulR 抱歉。不是真正的错误。当我运行 .exe 文件时,它显示“bacon.exe 已停止工作”
  • 你可以在这里查看stackoverflow.com/questions/3771154/…

标签: c++


【解决方案1】:

您的计算机有足够的内存,但只能在堆栈上分配这么多内存。尝试在堆上分配它:

Bacon **bacs = new Bacon*[objs];

及以后:

delete[] bacs;

【讨论】:

  • 替代方法 - 使用 std::vector&lt;Basic*&gt;。这支持在运行时调整大小,这在此处并不是真正需要的,但在 C++ 中,无论如何都更喜欢向量而不是数组是惯用的。更重要的是,向量实际上为您管理一个堆分配的数组——它绕过了堆栈大小限制问题,但您不必担心newdelete。缺点是数组有时效率更高,尤其是堆栈内存中的数组,但这对于正在开发库容器的低级程序员来说更值得担心。
  • 又一票投给std::vector,而不是new。 IMO,new 的唯一位置是初始化 unique_ptrshared_ptr
【解决方案2】:

您的堆栈空间可能已用完。

您在堆栈上分配大量指针。堆栈是有限的资源(通常每个进程 8 兆字节)。指针大小通常为 4 或 8 字节;将它乘以一百万,你就超出了这个限制。

【讨论】:

  • 对不起,我真的不知道那是什么。我是菜鸟。
  • 每个程序都有 3 种类型的内存:全局(在启动时分配一次)、动态(使用 new 分配)和堆栈。堆栈内存是存储 automatic 变量(如 objsbacs)的地方。 bacs 太大而无法放入堆栈。使用new
【解决方案3】:

据我所知,当您从内存中请求空间时,如果您使用的操作系统(我认为是 Windows)允许您占用它,您就可以占用并使用该空间。

出于某种原因,Windows 可能不允许您在这种情况下占用该内存。但我在这个领域并不是那么专家。我将其表述为一种想法。

【讨论】:

  • 你没有在栈上分配内存;你只知道基地址和限制。当堆栈指针寄存器(当前堆栈顶部)超出该限制时,会发生“堆栈错误”。这种情况无法处理(您没有堆栈),程序只是“停止工作”。不过,操作系统可能会在这方面提供更多信息。
【解决方案4】:

默认堆栈大小(windows visual studio 2005,可能其他人保持相同的数字)为1MB,请查看http://msdn.microsoft.com/en-us/library/tdkhxaks%28v=vs.80%29.aspx进行更改

linux 中的ulimit 来改变它。

堆解决方案也有效,但在您的示例中,您不需要堆。向操作系统请求堆内存以获取不会逃避当前功能的东西不是一个好习惯。在汇编程序中,堆栈被转换为更大的减法,通过其他需要更多处理的方法请求堆。

【讨论】:

  • 如果您需要大量对象怎么办? (即使你可能永远不需要超过 100000)
  • 嗯,堆栈是用来存放临时的东西,当我们返回调用者时应该忘记这些东西(或者当然是退出软件:p),所以,同样的事情也适用。现在,如果您不知道它可以使用多少空间并且您没有任何方法来计算它,那么使用堆来避免您在关键应用程序中遇到的错误会更加“防弹”,当然,并不意味着这是最好的做法。
猜你喜欢
  • 2013-03-01
  • 2023-01-04
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多