我的代码是:
int main() {
int t;
cin >> t;
while(t--){
int ladder,snake,temp,x,y;
cin >> ladder;
vector<vector<int> >ar(ladder,vector<int> ());
for(int i=0;i<ladder;i++){
cin >> x >> y;
ar[x].push_back(y);
}
cin >> snake;
for(int i=0;i<snake;i++){
cin >> x >> y;
ar[x].push_back(y);
}
}
return 0;
}
如果我提供输入
2
3
32 62
42 68
12 98
7
95 13
97 25
93 37
79 27
75 19
49 47
67 17
4
8 52
6 80
26 42
2 72
9
51 19
39 11
37 29
81 3
59 5
79 23
53 7
43 33
77 21
运行时错误即将来临并说内存管理不良。我的代码中出了什么问题?
答案 0 :(得分:1)
您将在数据序列
之后看到问题2
3
32 62
第一个值将由cin >> t
吸收,并且可以忽略此目的。
第二个值由cin >> ladder
吸收,导致ar
被分配为3个int向量的向量。
第三行将被cin >> x >> y
吸收,并将用于将ar内部索引为ar[x].push_back(y)
。由于x >= 3
的大小为ar
,因此您将写入未分配的内存,这将导致崩溃。
使用g++ -D_GLIBCXX_DEBUG -g -Wall test.cpp
编译的代码也将输出;
/usr/include/c++/4.9/debug/vector:357:error: attempt to subscript container
with out-of-bounds index 32, but container only holds 3 elements.
答案 1 :(得分:-3)
Joachim Isaksson提供了一个很好的答案,但问题似乎比这更深入。在试图弄清楚会发生什么的同时,我继续探索这个神奇的修复。像这样打开你的主循环:
int main() {
int t;
cout << "This is a fix. Crazy, huh?\n";
cin >> t;
老实说,我不能告诉你发生了什么事,但是这个对cout的调用阻止了我的机器上的segfaulting程序。每一个。单。时间。