【发布时间】:2018-07-17 18:11:46
【问题描述】:
我有这样的功能:
1 int main(){
2 int n,m; cin>>n>>m; // Only for illustration
3 vector<int> v[(int) 1e8] ;
4 // ...
5 }
由于第 3 行引起的堆栈溢出,我会出现分段错误。因为,我正在学习 gdb,所以我在 main() 和第 2 行设置了一个断点。
我期待程序在第 3 行之前不为对象分配内存,并且第 1 行和第 2 行应该正确运行。在运行第 3 行之后必须发生分段错误。
唉!运行程序时,在第 1 行之后导致分段错误。我使用了info locals,它给出了:
v= <error reading variable v (value requires 2400000000 bytes, which
is more than max-value-size)>
这意味着程序进入main后试图分配内存,但是为什么会这样呢? 我认为变量的范围来自声明它的行,否则在声明之前使用它会出错。 我用它来编译:
g++ -g temp.cpp -o temp -O0
编辑:
这个巨大的向量是故意的,因为我正在“学习”使用 gdb。但是后来我遇到了这个概念错误。
我将问题从 cmets 中指出的巨大向量 (1e10) 恢复为向量数组。
【问题讨论】:
-
您要分配一个
vector的100,000,000 个ints 吗?目前,您正在尝试分配 100,000,000vector<int>s -
您正在分配一个 array 向量。进入时为此分配空间。这显然超出了最大堆栈段大小。它还没有到运行第 3 行发生的向量的构造函数的地步。
-
尝试使用
vector<int> v(100000000);或查看reserve方法。注意()和[]之间的区别。后者表示数组。 -
@madhur4127
throwing an instance of 'std::bad_alloc'与stack overflow完全不同。此外,您是否在修改后检查异常是否在您最初预期的行抛出?我希望您的结果会有所不同。 -
我敢打赌,修改后上面的错误信息并不是完全不相关的。此外,当您停在第 2 行时,您不会抛出 bad_alloc。在我看来,上述更改完全取消了这个问题(你应该问一个新问题)。
标签: c++ memory gdb stack-overflow