2009-06-15 55 views
1

我有以下數據結構的聲明上,我做如下操作:總線錯誤/分段過錯的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

回答

0

似乎有明顯沒什麼錯,你已經發布的代碼。你如何創建QSweep對象?你能縮小你的代碼嗎?你可以通過一個簡單的例子來發布它嗎?

1

這無關你已經發布的代碼。問題必須存在於其他地方。你做任何動態內存分配?如果是這樣,它可能被搞砸了,使用矢量(這也是動態分配)只是暴露了問題。

由於您的代碼使用了很多向量,所以使用向量的運算符進行越界訪問可能會導致另一個問題。這些沒有被檢查並且很難追蹤。我唯一可以建議的是代碼檢查和明智地使用向量的at()訪問函數,這會在邊界違例時拋出錯誤。

根據您的平臺,您可能還想考慮使用內存調試工具,如Valgrind。

編輯:你指向double的向量對我來說似乎非常可疑 - 在這種數據結構很好的情況下不存在這種情況。我會仔細看看它是如何被使用的。

0

正如其他人指出的那樣,這段代碼沒有任何問題。只有我能想到的是,因爲您正在改變類的大小(通過添加一個額外的成員變量),您需要構建所有依賴於此的二進制文件(如果有多個二進制文件)。否則,創建的對象的大小會有不一致。

1

因爲我們不可能在此階段通過查看代碼來確定原因,所以您應該開始使用它的調試器。我個人推薦valgrind。經常在發生段錯誤時發現問題的原因非常好。

0

QSweep的2參數構造函數在其初始化列表中調用函數,例如

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

這是依賴於類成員的聲明順序,因此可能會導致您的問題。成員函數可能會在構造之前調用成員向量。