C ++变量大于堆栈(堆栈溢出)

时间:2014-02-23 17:56:46

标签: c++ stack-overflow

我需要像这样创建一个数组

double grid [15000][40];

但Visual Studio 2012中的堆栈只有1MB。我怎样才能使用像这样或更大的变量? 这意味着如果我创建一个

std::vector<int>

我push_back 600 000次进入堆栈溢出?这似乎是一个很大的限制,怎么解决? 提前谢谢。

5 个答案:

答案 0 :(得分:3)

大型对象应具有静态或动态存储持续时间。

<强>静态:

int a[1000000];

void f()
{
    a[3] = 12;    // fine
}

请注意对静态内存的共享,并发访问。

动态(但由合适的班级妥善管理)

void f()
{
    std::vector<int> a(1000000);   // dynamic objects managed by std::vector
    a[3] = 12;
}

这里每个函数调用都会创建和管理自己的动态分配(并发性的复杂性被委托给内存分配器,所以你不必考虑那些)。

答案 1 :(得分:2)

这里没有问题。

  

这意味着如果我创建一个std :: vector并且我push_back 600 000次它会进入堆栈溢出?这似乎是一个很大的限制

不,因为矢量元素没有自动存储持续时间(它们不会“存在于堆栈中”)。他们不能。

  

怎么解决

没有什么可以解决的。向量元素是动态分配的。

答案 2 :(得分:0)

您可以将此数组定义为

static double grid [15000][40];

对于std::vector,它为堆中的元素分配内存而不是堆栈。

答案 3 :(得分:0)

vector的内存是堆分配的,你不必担心堆栈。 您可以使用成员函数resize:

,而不是执行push_back
 std::vector<int> grid;
 grid.resize(15000*40);

甚至更好,如果网格具有固定大小,您可以使用唯一指针

答案 4 :(得分:0)

如果您因任何原因不想使用std::vector,可以选择另一种方法:

int main()
{
  int (*grid)[40] = new int[15000][40];

  // work with grid
  grid[0][0] = 0.0;
  grid[14999][39] = 42;

  delete [] grid;
}

通常的警告适用于动态存储的原始指针,如果范围由异常终止,则会导致内存泄漏,因此delete永远不会执行。