2011-10-14 64 views
0
我不經常使用C++我目前具有使用Microsoft C++指針問題的DO


我已經定義了一個半邊數據結構。代碼示例顯示了結構的一部分。函數調用後爲什麼指針不爲空?

struct edge 
{ 
    HalfEdge *he1; // pointer to right halfedge 
    HalfEdge *he2; // pointer to left halfedge 
    Edge  *nexte; // pointer to next edge 
    Edge  *preve; // pointer to previous edge 
}; 

struct halfedge 
{ 
    Edge  *edg; // pointer to parent edge 
    Vertex  *vtx; // pointer to starting vertex 
    Loop  *wloop; // back pointer to loop 
    HalfEdge *nexthe;// pointer to next halfedge 
    HalfEdge *prevhe;// pointer to previous halfedge 
}; 

現在我已經用NULL初始化Edge的變量。
我在邊緣工作的方法。

void CDataStructureBuilder::create4VertFace(Face* f,Vertex* v1,Vertex* v2, Vertex* v3, Vertex* v4,Edge* e1,Edge* e2,Edge* e3,Edge* e4){ 
    Loop outerLoop; 

    createHalfEdges(v1,v2,e1); 
    createHalfEdges(v2,v3,e2); 
    createHalfEdges(v3,v4,e3); 
    createHalfEdges(v4,v1,e4); 


    outerLoop.lface = f; 
    outerLoop.ledge = e1->he2; 

    connectEdges(e1, e2); 
    connectEdges(e2, e3); 
    connectEdges(e3, e4); 
    connectEdges(e4, e1); 

如果我使用調試器,我看到e1的變量he1和he2包含0x000000。現在我稱之爲以下功能。

空隙CDataStructureBuilder :: createHalfEdges(頂點* V1,頂點V2 *,邊緣* ED){ 如果(ED-> HE2 == NULL){ 半邊* H =新半邊(); h-> vtx = v1; h-> edg = ed; ed-> he2 = h; } 如果{ 半邊* H =新半邊()((ED-> HE1)!); h-> vtx = v2; h-> edg = ed; ed-> he1 = h; } }

現在,如果我使用調試器,指針ed具有相同的地址,但變量he2和he1不再包含0x000000。它們包含0xccccccc。因此,方法createHalfEdges中的if-condition ed-> he2 == NULL爲false。

誰能告訴我,我在做什麼錯?

附加信息:
create4VertFace的外方法執行以下操作:

Vertex* vertices; 
vertices = createVertices(); 

Edge* edges; 
edges = createEdges(); 

create4VertFace(&bottom, &vertices[0], &vertices[1], &vertices[2], &vertices[3], &(edges[0]), &(edges[1]), &(edges[2]), &(edges[3])); 

createedges我已經定義以下面的方式的邊緣。這可能是錯誤嗎?

Edge* CDataStructureBuilder::createEdges(void){ 
    Edge edgelist[24]; 

    Edge e0t1 = {NULL,NULL,NULL,NULL}; 
    // ... 
    edgelist[0] = e0t1; 
    // ... 
} 

回答

5

的問題是在這裏:

HalfEdge h; 
    ... 
    ed->he2 = &h; 

h超出範圍,當您退出封閉塊。結果ed->he2,同時保持它的價值,成爲一個dangling pointer

解決此問題的一種方法是在堆上分配HalfEdge實例(使用new)。

編輯:它看起來像createEdges()有相同的bug:它創建一個指向e0t1的指針。後者位於堆棧上並在函數返回時超出範圍。

+0

但爲什麼if中的條件總是假的?該imho與HalfEdge h無關。我首先要檢查變量ed-> he2和ed-> he1是否已經有地址,如果不是,我想添加必要的數據。如果我將if條件複製到外部方法並使用e1,則一切正常。 – martin

+0

@martin:向我們展示更多代碼。你也可能在其他地方犯同樣的錯誤。 – NPE

+0

我已經添加了一些信息 – martin

1

的0xCC使用由Visual C++編譯器填充未初始化的數據。最有可能ed指着這是在堆棧中創建一個臨時對象,其內容被後來被毀,並在接下來的通話得到覆蓋。

請注意,ed->he2 = &h;也需要臨時對象h的地址,這與擰緊ed的內容的錯誤是一樣的。

相關問題