【问题标题】:C++ Segmentation Fault in code fragment代码片段中的 C++ 分段错误
【发布时间】:2013-07-17 20:16:19
【问题描述】:

我在 Eclipse 中测试了我的代码,一切正常 - 我现在正在从终端运行项目并不断收到分段错误。我已将问题缩小到这一部分:

[此代码使用节点指针向量构造距离矩阵。]

for(unsigned int j=0;j<numPts;j++) {
     for(unsigned int k=j+1;k<numPts;k++) {
         Node* a = points[j];
         Node* b = points[k];
         double xd = a->GetX()- b->GetX();
         double yd = a->GetY() - b->GetY();

        unsigned int dab = int(round(sqrt(xd*xd + yd*yd)));
        (*distances)[(int)j][(int)k] = dab;
        (*distances)[(int)k][(int)j] = dab;
      }
}

如何修复这段代码,以免出现任何分段错误?

[编辑] - 崩溃的行是double xd = a-&gt;GetX() - b-&gt;GetX(); 行。

[编辑 2] - 这就是我创建矢量的方式:

std::vector<Node*> myVec;
Node* p1 = new Node(xval, yval);
myVec.push_back(p1);

[编辑 3] - 这就是我实现节点的方式:

#include <utility> 
class Node : public std::pair<double, double> 
{ 
public: 
        Node(double x, double y) : std::pair<double, double>(x,y) 
        {} 

        double GetY() const {return second;} 
        double GetX() const {return first;} 

}; 

所以我发现了问题... myVec[0] 处的指针不是 NULL,但它以某种方式损坏了。我在向量的开头“插入”了一个元素,这导致了所有的错误:

std::vector<Node*>::iterator it;
it = myVec.begin();
myVec.insert(it, newNodePtr);

删除它后,一切正常。

【问题讨论】:

  • 在调试器或 valgrind 中查看您到达这些数组或向量之外的哪一行。
  • 能看到积分的声明吗?和距离?
  • 只是让你知道,在这两种情况下你都可能有一个错误。 Eclipse 并不神奇,它只是可能会给你更大的内存空间,这样超出数组边界就不会导致段错误。
  • “如何避免段错误”的实际答案。 1)使用智能指针(对于您的点 a 和 b)或实例,避免使用像瘟疫这样的愚蠢指针。 2)使用向量而不是新的数组(或者如果你觉得很花哨,可以使用 std::array )。 3. 遵循 3 规则(c++11 为 5 规则或 0 规则)。
  • @asriraman93 向我们展示如何创建这些向量和节点。

标签: c++ segmentation-fault


【解决方案1】:

如果该区域确实是故障的原因,请检查:

Node* a = points[j];
Node* b = points[k];

对于NULL 或错误的指针值,在尝试取消引用它们之前,

另外,请确保 distances 是非 NULL 并且也是您的第二个分配中的有效指针,并且作为二维偏移量的 j 和 k 指向实际的 distances 缓冲区而不是超出它(确保 @ 987654325@ 确实是您要用作缓冲区端点的意思。)

如果你不能if他们,那么至少assert他们。

来自您的编辑

我的帖子的第一部分适用 - a 和/或 b 几乎肯定是坏的或 NULL 指针,这会导致你的崩溃。查看您如何将内存分配给该数组/容器/无论它是什么,或检查它是否存在内存损坏。

【讨论】:

  • 我确保指针不为空,所以我猜它们一定是“坏的”。如何以更好的方式创建指针向量,以便以后能够访问它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2018-10-26
  • 2014-08-29
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多