全局向量在 C++ 程序结束时导致段错误

Posted

技术标签:

【中文标题】全局向量在 C++ 程序结束时导致段错误【英文标题】:Global vector causing a segfault at end of c++ program 【发布时间】:2020-06-18 23:30:45 【问题描述】:

该程序在最后打印出“再见”,然后出现段错误。我不知道为什么。我认为这可能与全局向量有关?我玩过它,发现如果我去掉 cout

    int n, p, k;
    vector<vector<int>> plates;

    int main() 
      int T;
      cin >> T;
      for (int t = 1; t != 1 + T; ++t) 
        cin >> n >> k >> p;
        plates.resize(n + 1, vector<int>(k + 1, 0));
        for (int i = 1; i <= n; ++i) 
          for (int j = 1; j <= k; ++j) 
            cin >> plates[i][j];
            cout << i << "," << j << "\t";
          
          cout << endl;
        
      
      cout << "bye" << endl;
    

【问题讨论】:

为什么首先要有一个全局的vector 你可能超出了你的向量范围。 n,p,k,T都不是很大,最多30个。 -- 那你应该把这些值直接放到变量里面,不要用@ 987654323@。我们不知道您的代码真正输入了什么。我们所拥有的只是您的承诺,而在从某个地方获取意见时,承诺很多时候都没有兑现。 我使用一个全局的所以我不必传入参数。这是针对时间=更多积分的编码竞赛。 @drescherjm 改用参考参数。全局变量应保持在最低限度。当你的代码是成千上万的 c++ 源代码行并且你需要调试时,你会感谢自己没有使用全局变量。 【参考方案1】:
plates.resize(n + 1, vector<int>(k + 1, 0));

resize() 并没有按照你的想法去做。 resize() 确实将调整大小的向量中的每个值设置为第二个参数,在这里。只有向量中的 值(如果增长)被设置为此值。

因此,如果第一次通过外循环向量是 2 行乘 2 列,第二次通过外循环将尺寸指定为 50x50,这将向 plates 添加 48 个值,这每个值都是一个包含 50 个值的向量。

plates向量中的前两个值保持不变,其中包含它们原来的二值向量。

解决方案似乎很明显:在此resize() 之前添加plates.clear()

【讨论】:

谢谢!这就解释了。

以上是关于全局向量在 C++ 程序结束时导致段错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

C++ 为啥在向量段错误中放置对象?

c++ 类向量中的段错误

C++ 程序结束时的 thread_local 向量分段错误

超过向量不会导致段错误

分段错误:在 C++ 中弹出向量时出现 11