为什么运行时错误会出现在我的代码中?

时间:2016-04-10 13:47:42

标签: c++

我的代码是:

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

运行时错误即将来临并说内存管理不良。我的代码中出了什么问题?

2 个答案:

答案 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程序。每一个。单。时间。