使用向量时堆栈溢出

时间:2014-10-23 22:32:11

标签: c++ vector stack-overflow

我为学校的小竞赛做了一个程序,我有:

#include <iostream>
#include <vector>    

int main(){
  int n;
  std::cin >> n;
  int c[n];
  std::vector<int> r(n);
  std::cout << "I made it through";
  //rest of program
}

当我键入1000000并按下输入程序崩溃时,退出代码(0xC00000FD)。我推测它发生在我初始化矢量时,但我可以处理更多。难道我做错了什么?我知道我可以使用指针,但我不想触摸已经有效的东西。

3 个答案:

答案 0 :(得分:2)

堆栈是一种非常有限的资源。

即使您的编译器似乎在C ++(int c[n];)中实现C风格的VLA,它也不会神奇地获得更多内存。

测试1)在执行分配该堆栈数组的语句之前,读取n和2)n的成功不会超出您的使用范围。

Windows的默认堆栈大小:1MB sizeof(int):4因此,大约250000适合 Linux的默认堆栈大小:8MB sizeof(int):4因此,大约2000000适合。

解决方法:对int使用动态分配,例如使用std::vector

std::vector<int> c(n);

或者,至少使用智能指针:

std::unique_ptr<int[]> c(new int[n]);

答案 1 :(得分:1)

问题不是vector(在大多数STL实现中将堆用于其底层扩展存储),而是int c[n],它将在堆栈中分配1,000,000个4字节整数,这是差不多4MB。在Win32上,堆栈默认大约为1MB,因此溢出。

如果确实需要使用数组,请使用c更改要在堆上分配的new数组,但不要忘记delete[],否则使用{ {1}}是大多数扩展存储方案的首选。如果你需要一个固定长度的数组,那么考虑添加边界检查的vector(C ++ 11中的新增内容)。

答案 2 :(得分:0)

您可能只需要动态分配数组。在C ++中

#include <iostream>
#include <vector>    

int main()
{
  int n;
  std::cin >> n;
  int *c = new int[n];

  if(nullptr == c) {
    std::cerr << "Runtime error" << std::endl;
    return 1;
  }

  std::vector<int> r(begin(n), end(n));
  std::cout << "I made it through";

  delete[] c;
  return 0;
}

在动态分配c之后制作向量时,您可以使用beginend