总线错误/分段过错的std ::矢量声明

问题描述:

我有以下数据结构的声明上,我做如下操作:总线错误/分段过错的std ::矢量<int>声明

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

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

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

//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{ 
    .... 
    } 

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

地址: 是的,我有几个内存分配和类型矢量的变量其他几个声明(其实很多)。例如: -

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,现在它eems我再也不会遇到分段错误或总线错误消息的问题。 我希望这是错误的。

+0

您能否提供更多关于此句子的信息:“根据我声明的变量方向,我获得了总线错误消息还是分段错误消息”?否则,我没有看到代码有任何问题。 – Naveen 2009-06-15 10:01:14

+0

如何使用myIntersections?元素是否指向另一个向量中的双倍? – 2009-06-15 10:52:08

似乎有明显没什么错,你已经发布的代码。你如何创建QSweep对象?你能缩小你的代码吗?你可以通过一个简单的例子来发布它吗?

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

由于您的代码使用了很多向量,所以使用向量的运算符进行越界访问可能会导致另一个问题。这些没有被检查并且很难追踪。我唯一可以建议的是代码检查和明智地使用向量的at()访问函数,这会在边界违例时抛出错误。

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

编辑:你指向double的向量对我来说似乎非常可疑 - 在这种数据结构很好的情况下不存在这种情况。我会仔细看看它是如何被使用的。

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

因为我们不可能在此阶段通过查看代码来确定原因,所以您应该开始使用它的调试器。我个人推荐valgrind。经常在发生段错误时发现问题的原因非常好。

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

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

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