【问题标题】:error while declaring double array of size 150000? [duplicate]声明大小为 150000 的双数组时出错? [复制]
【发布时间】:2013-04-19 06:22:14
【问题描述】:

我正在开发一个代码,其中需要声明大小为 150000 的双精度数组,当声明一个数组时,代码运行成功。如果我们声明两个数组,那么在执行时它会终止抛出异常。

Code is :

double a[150000];
double b[150000];

如果我们只声明a,那么它会完美执行。如果同时声明a和b,那么它就会终止。 谁能建议如何解决这个问题?

【问题讨论】:

  • Stackoverflow,对吧?给数组静态存储或使用std::vector
  • 如果在函数中本地声明这些数组,它们的堆栈空间超过 2MB。在 Windows 上,默认堆栈大小仅为 1MB。
  • 假设这些确实是局部变量,需要的空间是 2 * 8 * 150000(在 x86 上),大约是 2.2 MB。许多操作系统将进程的最大堆栈限制为小于该值。
  • 使它们成为浮点数组。问题解决了!
  • @HotLicks - 问题已解决,但引入了新问题!

标签: c++


【解决方案1】:

这两个数组是overflowing the stack(假设它们是局部变量)。而是为数组动态分配内存,使用 std::vector 为您管理内存:

std::vector<double> a(150000);
std::vector<double> b(150000);

即使std::vector 实例在堆栈上,std::vector 也会在内部为堆上的数据动态分配内存,避免堆栈溢出。

【讨论】:

  • 这很好,但值得一提的是,在 C++03 中,最初不可避免地会变慢,因为在创建向量时会写入所有元素。
  • @TonyD:这只是 2M 的数据,初始化的成本很可能可以忽略不计。如果这是一个问题,还有其他选择,但很可能是要使用数组,在这种情况下,无论如何都必须支付大部分初始化成本(实际上是触及内存地址)......
【解决方案2】:

这个问题有一个解决方案,但它会导致(至少)三种不同的后续解决方案。解决方案是“不要使用大数组作为局部变量,因为它会炸毁堆栈”。

解决方案显然意味着以某种方式更改代码。有几种不同的方法可以做到这一点。

显而易见且直接的解决方案是改用std::vector&lt;double&gt;

另一种解决方案是使用`

unique_ptr<double[]> a = std::unique_ptr<double[]>(new double[150000]);

第三个,有时也是一个很好的解决方案,是创建ab 全局变量。

还有其他几种变体,但它们通常是同一主题的变体,只是略有不同。在您的情况下最好的方法实际上取决于您的其余代码在做什么。我将从std::vector&lt;double&gt; 开始,但确实存在其他替代方案,如果由于某种原因这是一个不合适的解决方案。

【讨论】:

  • &lt;unique_ptr&gt; 会泄漏,因为使用 delete 运算符而不是 delete []
  • 我刚刚在缺失的空间中进行了编辑,它显示了额外的[],我相信它可以解决这个问题,不是吗?
  • 算了 =) 5 分钟前我发现&lt;unique_ptr&gt; 具有用于数组的模板特化,带有正确的删除器。不错吧?
【解决方案3】:

好的!您的应用中有Stack Overflow

修复示例:

  • 不要使用堆栈 - 使用 dynamic memory allocation (heap):

    double* a = new double[150000];

  • 使用 STL 容器,例如,vector - 在内部它在堆上分配东西

    std::vector&lt;double&gt; a(150000);

  • 增加堆栈大小(坏主意,但如果你真的需要它,请阅读编译器文档,并查看 here

  • 以某种方式重新设计您的代码

【讨论】:

  • 不要像那样使用动态内存分配。使用&lt;vector&gt; 或至少make_sharedmake_unique
  • @Bartek Banachewicz 好吧,&lt;vector&gt; 没问题,但 &lt;unique_ptr&gt;&lt;shared_ptr&gt; 在这里完全错误:它们会泄漏,因为使用 delete 运算符而不是 delete []跨度>
  • 您可以放心地使用unique_ptr&lt;T[]&gt;,它会调用delete[]。您可能想更新有关智能指针的知识。
  • @Bartek Banachewicz 哎呀!看来我古老的大脑有点过时了。所以 具有数组的模板特化。那么 呢?
  • 对于shared_ptr,您需要自己的删除器。仍然没有泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多