我有以下数据结构声明,我将在其中进行以下操作:
//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初始化它,现在看来我对分段错误或总线错误消息没有任何问题。 我希望这是错误的。
答案 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())
...
这是依赖于类成员的声明顺序的东西,因此可能会导致您的问题。成员函数可以在构造之前调用成员向量。