std :: vector <int>声明的总线错误/分段错误</int>

时间:2009-06-15 09:55:54

标签: c++

我有以下数据结构声明,我将在其中进行以下操作:

//QSweep.cpp
 void QSweep:: createLoops(){ 

 std:: vector< int > orientationUE;
 if (test1)
     orientationUE.push_back(1);
 else
     orientationUE.push_back(-1);

到目前为止一切正常。 问题是我有几个文件,我希望orientationUE是类QSweep的数据,而不仅仅是方法createLoops()中的局部变量。 所以我在QSweep.h文件中添加了变量orientation的声明

 //QSweep.h
 class QSweep{
    ....
    std::vector< int > orientationUE;
    ....
 }

 //QSweep.cpp
 void QSweep:: createLoops(){
    if (test1)
     orientationUE.push_back(1);
    else
     orientationUE.push_back(-1);
 }

在这种情况下,我获取了总线错误消息或分段错误消息,具体取决于我在

中声明我的变量orientationUE的位置
  class QSwepp{
  ....
  }

我不明白到底发生了什么。

ADD: 是的我有几个内存分配和几个其他类型vector变量的声明(实际上很多)。 E.g:

typedef Seq< vector<int> > MxInt2d;
class QSweep
{   
public:
  QSweep(){};
  QSweep(const MxDouble2d& myPoints, const MxInt2d& myEdges);
  void intersection();

  //data and functions for inserting the missing edges in the graph
  void completeGraph();   

  MxInt2d myEFCG;
  std::vector< int > vNoClone;
  std::vector< int > vEdge;

  ....

  int nbIntersections;
  MxInt2d sweepEvents;
  std::vector<double*> myIntersections;
};

我仍然在这些数据类型上应用了很多算法,我得到的结果没有分段错误或总线错误消息。 所以你认为错误是在其他内存分配工作中的某个地方。 UFF .. 我以前很怕那个。我仍然不明白好结果,但它们有误导性吗?如何在这种情况下准确检测到错误?

ADD_NEXT:

矢量myIntersections按以下方式创建:

 double* QSweep::computeIntersection(double m1, double b1, double m2, double b2){
double* v=new double[3];

v[0]= (b2-b1)/(m1-m2);
v[1]= (m1*b2-m2*b1)/(m1-m2);
v[2]=0.00;

return v;
 }


 double* QSweepComplete::findIntersection(edge_t edge1, edge_t edge2){
    double* vector=NULL;

        if (test2){
             return NULL;
        }
        else{
          vector=computeIntersection(m1,b1,m2,b2);
          return vector;
        }           
 }

 void QSweep:: intersection(){
   double* vector=NULL;
   vector=findIntersection(edge1,edge2);
   if (vector!=NULL){
     myIntersections.push_back(vector);
   }
 }

当我显示向量myIntersections时,一切正常,加上我总是得到正确的大小:如果我有5个交叉点,向量中有5个元素,依此类推。 对我来说它看起来很干净,但不幸的是它可能不是:(

ADD_LAST(可能已解决): 大家好!

似乎问题是数据

    int nbIntersections;

我只在QSweep.cpp的函数中本地初始化它; 尽管如此,我使用了大量相同大小的向量和nbIntersections,因此在某些情况下变量包含一些不存在的数据。 所以我添加到构造函数并用0初始化它,现在看来我对分段错误或总线错误消息没有任何问题。 我希望这是错误的。

5 个答案:

答案 0 :(得分:1)

这与您发布的代码无关。问题必须在其他地方。你做任何动态内存分配吗?如果是这样,它可能搞砸了,使用向量(也进行动态分配)只是暴露了这个问题。

由于您的代码使用了大量向量,因此使用向量运算符进行越界访问是另一个可能的问题。这些都没有检查,很难追查。我唯一可以建议的是代码检查和明智地使用向量的at()访问函数,它将在边界违规时抛出错误。

根据您的平台,您可能还需要考虑使用内存调试工具,例如Valgrind。

编辑:你的双指针向量似乎对我非常怀疑 - 这种数据结构不是很好的解决方案。我会仔细研究一下如何使用它。

答案 1 :(得分:1)

由于我们无法通过查看此阶段的代码来确定原因,因此您应该开始使用调试器。我个人推荐valgrind。经常在发生段错误时找到原因非常好。

答案 2 :(得分:0)

您发布的代码似乎没有明显错误。你是如何创建QSweep对象的?您可以将您拥有的代码缩小到一个简单的示例并发布吗?

答案 3 :(得分:0)

正如其他人所说,这段代码没有任何问题。我唯一能想到的是因为你正在改变类的大小(通过添加一个额外的成员变量),你需要构建依赖于此的所有二进制文件(如果有多个二进制文件)。否则,创建的对象的大小将不一致。

答案 4 :(得分:0)

QSweep的2参数构造函数是否在其初始化列表中调用函数,例如

QSweep(const MxDouble2d& myPoints, const MxInt2d& myEdges)
:   sweepEvents(MemberFunctionCall())
...

这是依赖于类成员的声明顺序的东西,因此可能会导致您的问题。成员函数可以在构造之前调用成员向量。