我不经常使用C++,我现在遇到使用Microsoft C++指针的问题.
我已经定义了一个半边数据结构.代码示例显示了结构的一部分.
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
};
Run Code Online (Sandbox Code Playgroud)
现在我已经将Edge的变量初始化为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);
Run Code Online (Sandbox Code Playgroud)
如果我使用调试器,我看到e1的变量he1和he2包含0x000000.现在我调用以下函数.
void CDataStructureBuilder :: createHalfEdges(Vertex*v1,Vertex*v2,Edge*ed){if(ed-> he2 == NULL){HalfEdge*h = new HalfEdge(); h-> vtx = v1; h-> edg = ed; ed-> he2 = h; } if(!(ed-> he1)){HalfEdge*h = new HalfEdge(); h-> vtx = v2; h-> edg = ed; ed-> he1 = h; }}
现在,如果我使用调试器,指针ed具有相同的地址,但变量he2和he1不再包含0x000000.它们包含0xccccccc.因此方法createHalfEdges中的if-条件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]));
Run Code Online (Sandbox Code Playgroud)
在createedges
我用以下方式定义边缘.这可能是错误吗?
Edge* CDataStructureBuilder::createEdges(void){
Edge edgelist[24];
Edge e0t1 = {NULL,NULL,NULL,NULL};
// ...
edgelist[0] = e0t1;
// ...
}
Run Code Online (Sandbox Code Playgroud)
问题出在这里:
HalfEdge h;
...
ed->he2 = &h;
Run Code Online (Sandbox Code Playgroud)
h
退出封闭块时超出范围.结果ed->he2
,在保持其价值的同时,成为一个悬垂的指针.
修复它的一种方法是HalfEdge
在堆上分配实例(使用new
).
编辑:它看起来createEdges()
有相同的错误:它创建一个指针e0t1
.后者存在于堆栈中,并在函数返回时超出范围.
归档时间: |
|
查看次数: |
435 次 |
最近记录: |