【问题标题】:Overwriting Vectors C++覆盖向量 C++
【发布时间】:2011-11-22 14:32:17
【问题描述】:

我试图将值覆盖到我的向量中:

  for (i = 0; i < 50; i++)
  {      
        LJ.clear();
        LJ.reserve(210);

        //Calculate Lennard-Jones potential of every pair
        for(itr = 0; itr < 210; itr++)
        {
            term1 = pow(r[itr], 12);
            term1 = 1/term1;
            term2 = pow(r[itr], 6);
            term2 = 2/term2;
            LJ.push_back(term1 - term2);
        }

        //Calculate the initial Energy in the system Ei
        Ei = accumulate(LJ.begin(), LJ.end(), 0.0);
        Ei = Ei/2;
        cout << Ei << endl;
    }

但是,每当我遇到循环两次时,向量的容量都会得到一些垃圾值,当我尝试将一个项目推入时,我遇到了分段错误......如果我离开了我们的保留部分,我仍然有一个段错误

【问题讨论】:

  • 您不需要在外循环的每次迭代中都使用reserve,因为vec.clear() 被定义为vec.erase(vec.begin(), vec.end()),这不会减少容量。另外,“每当我遇到循环两次”是什么意思?
  • 向我们展示 r 及其人口的代码。
  • r的定义是什么?
  • 对我来说运行良好codepad.org/vXpHI0Ro
  • 另外,如果 term2 曾经等于 0,你会得到一个除以 0 的结果,这很可能会崩溃

标签: c++ vector segmentation-fault


【解决方案1】:

但是,每当我遇到循环两次时,向量的容量都会得到一些垃圾值 [...]

这是内存损坏的明显迹象。

您可能在堆栈上有一个数组,并且您正在覆盖超过数组限制的堆栈,“踩到”向量的脚趾。无论哪个数组更接近LJ 声明,都可能是不幸写入的目标。

【讨论】:

    【解决方案2】:

    如果r 也是std::vector,请尝试将内部循环更改为以下内容:

    // assuming r is a vector<double>
    for(vector<double>::iterator it = r.begin(), ite = r.end(); it != ite; ++it){
      // use *it instead of r[itr];
      term1 = pow(*it, 12);
      term1 = 1/term1;
      term2 = pow(*it, 6);
      term2 = 2/term2;
      LJ.push_back(term1 - term2);
    }
    

    但是,如果r 是静态分配的数组(即在堆栈上),请将其更改为:

    for(int itr = 0; itr < sizeof(r)/sizeof(r[0]); ++itr){
      // same content...
    }
    

    如果这不是段错误,r 是 not 有 210 个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-18
      • 2017-02-25
      • 1970-01-01
      • 2011-06-11
      • 2021-06-11
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多