【问题标题】:array of size 1 MB大小为 1 MB 的数组
【发布时间】:2012-04-04 14:16:23
【问题描述】:
#include<iostream>
#include <intrin.h>
using namespace std;
unsigned __int64 TimeValue=0;

unsigned __int64 rdtsc(void) 
{  
   return __rdtsc(); 
};

void time_start() { TimeValue=rdtsc(); }
long long time_stop() { 
    return (rdtsc()-TimeValue); 
}
int main()
{
    long x[262144],i,k,r;
    int j;
    x[0] = 0;
for (i=1; i<262144; i++)
{
    long r = rand()%i;
    x[i] = x[r];
    x[r] = i;
}
    time_start();
    for (j=0; j<1000; j++)
        for (k=0, i=0; i<262144; i++) 
            k = x[k];
    cout<<time_stop()/1000/262144;
}

在程序中,我需要创建一个大小为 1 兆字节的数组。在long x [262144]行调试程序时,出现错误:“dgdxgdrfy.exe”中的未处理异常“0x00ff1997”:0xC00000FD:堆栈溢出。为什么会这样以及如何解决?

【问题讨论】:

  • 尝试将您的数组声明为全局。

标签: c++ stack-overflow


【解决方案1】:

尝试将其声明为全局变量 - 在main 方法() 之外。否则它将被分配到远小于堆的栈上。另一种解决方案是使用new 的动态分配,但这更容易出错。

【讨论】:

  • 如果您使用new,请使用智能指针(std::unique_ptrstd::shared_ptr)。更好的是,使用std::vector
  • 全局变量可能在这个特定示例中有效,但这是一个不好的习惯。
  • 谢谢,提供一个全局变量数组真的很有帮助。
【解决方案2】:

局部变量在堆栈上分配,但堆栈是有限的。您可能可以通过打开编译器来增加限制。

问题在于您声明的数组非常大。一个简单的修复方法是将它从堆栈上更改为动态分配:

std::vector<long> x(262144);

【讨论】:

    【解决方案3】:

    这是因为在堆栈上分配了一个本地数组。您可以通过使用动态数组(使用 new 创建的)、向量或在全局范围内声明数组来避免这种情况。

    【讨论】:

      【解决方案4】:

      基本上,您应该动态分配 x 数组,如 this article 所示。以下示例是从文本中提取的,如果您将其更改为适合您的情况,它应该可以正常工作。

      double *num; 
      num = (double *) malloc (BUFSZ* sizeof(double))
      

      【讨论】:

      • 既然我们有new,为什么还要malloc
      • @PetarMinchev:该示例是特定于 C 的,但任何形式的动态分配都应该这样做......
      【解决方案5】:

      您可以使用static long x[262144];它确实将分配移出堆栈,您根本不需要修改代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 2012-06-28
        • 1970-01-01
        相关资源
        最近更新 更多