c++ - 为什么函数调用后指针不为空?

标签 c++ pointers

我不经常使用 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/

相关文章:

c++ - 模拟一个虚拟拷贝构造函数

C指针数组/指针数组消歧

c++ - 生产者完成后通知消费者的优雅方式?

c++ - 如何在 Qt 中向工具栏添加按钮/操作以外的控件,例如文本框和组合框?

char 指针在两种不同情况下的行为不同

c# - 使用从 C# 到非托管驱动程序的嵌入式指针编码结构

使用 char 指针复制 C 结构

c++ - Armadillo solve()线程安全吗?

c++ - 当我尝试从 boost::regex_match(text, e) 捕获异常时,为什么会得到一个核心转储?

c++ - shared_ptr 在我可以正确使用它之前就被销毁了