0

コードを 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->GetX() - b->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);

それを削除すると、すべてが機能しました。

4

1 に答える 1

0

その領域が実際に障害の原因である場合は、以下を確認してください。

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

NULLそれらを逆参照しようとする前に、または不良なポインター値、

また、distancesが非 NULL であり、2 番目の割り当てでも有効なポインターであること、および 2 次元オフセットとしての j および k が実際のdistancesバッファーを指していて、それを超えていないことを確認してください (それが実際にバッファーnumPtsとして使用する意図であることを確認してください)。終点。)

それらができない場合はif、少なくともassertそれらを。

あなたの編集から

私の投稿の最初の部分が適用されます-aおよび/またはbほぼ確実に悪いまたはNULLポインターであり、クラッシュを引き起こしています。その配列/コンテナ/にメモリをどのように割り当てているかを確認するか、メモリの破損を確認してください。

于 2013-07-17T21:07:38.573 に答える