程序终止于大型数组的初始化

Ser*_*nov 1 c++ arrays vector

我有V = 3997962,我希望有一个这个大小的数组,由C++中的int向量组成.

当我像这样初始化它:

const int V = 3997962;

vector<int> array[V];
Run Code Online (Sandbox Code Playgroud)

程序终止而不会提示任何错误.

是堆栈溢出错误吗?我怎么能这样做?

我应该像这样定义它:

vector<int>* test = new vector<int>[V];
Run Code Online (Sandbox Code Playgroud)

如何将此变量传递给函数?它应该如何定义为一个论点?毕竟我需要删除它吗?

jxh*_*jxh 6

如果这是一个局部变量,你基本上要求自动存储中有近800万个指针变量.由于堆栈溢出,这可能会失败.

您可以改为使用向量向量.

vector<vector<int>> array(V);
Run Code Online (Sandbox Code Playgroud)

上面的结果是一个名为的向量array,用V默认的初始化vector<int>s 填充.


Jos*_*eld 6

它很可能是堆栈溢出.

你正在分配V vector<int>s.虽然这些向量的元素将在堆上分配,但向量本身(包含指针和一些其他对象)正在堆栈上分配.如果你有V这些,你可能会达到你的堆栈限制.

vector<int>* test = new vector<int>[V];
Run Code Online (Sandbox Code Playgroud)

这是一种可能的解决方案,但并不理想.它将要求您delete[]稍后使用delete[] test;.您可以通过将此动态分配的数组包装在更智能的指针中来解决此问题,但请继续阅读以获得更好的解决方案.

你如何将它传递给其他函数并不是真正相关的(你应该完全独立于客户端如何分配它们来设计函数参数),但你可以只传递指针:

void f(vector<int>* param);
f(test);
Run Code Online (Sandbox Code Playgroud)

或者可以将参数写为vector<int> param[],这可以更好地表示该指针指向数组.consts也可以添加到你想要不变的地方.但是,通过new完全避免使用和原始指针,我们可以找到更好的解决方案.

相反,我建议有一个vector<vector<int>>:

vector<vector<int>> test(V);
Run Code Online (Sandbox Code Playgroud)

现在你实际上只有一个vector在堆栈上.vector它们本身vector的元素将在堆上分配,它们的元素也是如此.

  • 不过,它可能值得一提.我们不得不以某种方式让人们离开这个`new` /`delete`废话. (2认同)