我不经常使用 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
};
现在我已经用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。现在我调用以下函数。
void CDataStructureBuilder::createHalfEdges(Vertex* v1, Vertex* v2, Edge* ed){ 如果 (ed->he2==NULL){ HalfEdge* h = new HalfEdge(); h->vtx = v1; h->edg = ed; ed->he2 = h; } 如果 (!(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 为假。
谁能告诉我,我做错了什么?
附加信息:
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;
// ...
}
最佳答案
问题出在这里:
HalfEdge h;
...
ed->he2 = &h;
h
在您退出封闭 block 时超出范围。结果 ed->he2
在保持其值的同时变成了 dangling pointer .
修复它的一种方法是在堆上分配 HalfEdge
实例(使用 new
)。
编辑: 看起来 createEdges()
有同样的错误:它创建了一个指向 e0t1
的指针。后者存在于堆栈中,并在函数返回时超出范围。
关于c++ - 为什么函数调用后指针不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7769321/