C ++释放内存让我中止转储?

时间:2015-05-14 22:31:06

标签: c++ pointers memory segmentation-fault abort

我有一个解构函数,假设要释放我所做的指针,但它没有按预期工作。这是我的类的一部分,它声明了所有的指针

private:
    struct Edge {
        Vertex* node;
    };

    struct Vertex {
        vector< Edge > adjList;
        Vertex *path;

    };

    vector<Vertex*> vertices;
    priority_queue< Vertex* > pq;

偶尔我会在像Vertex* v = new Vertex这样的函数中声明新的顶点。我被告知我不必担心删除这些指针。继承我释放我的解构器所调用的记忆的功能

void makeEmpty( ) {
    for(int i = 0; i < total; ++i)
        makeEmpty( vertices[ i ] );
    total = 0;
}

void makeEmpty( Vertex * & v ) {
    for( int i = 0; i < v->adjList.size(); ++i ){
        //delete v->adjList[ i ].node;
        //v->adjList[ i ].node = nullptr;
    }
    if ( v->path != nullptr ) {
        makeEmpty( v->path);
        delete v;
        v = nullptr;
    }
}

我评论了我的adjList,因为我正在尝试不同的方法来实现这一点,但没有任何方法。任何人都可以帮助我吗?

忘记提及所有这些指针都与相同的顶点/节点相关。所有使用的顶点/节点都在我的顶点

编辑:我得到了它的工作,结果我过于复杂的事情,只是需要这样做

void makeEmpty( Vertex * & v ) {
        delete v;
        v = nullptr;
}

1 个答案:

答案 0 :(得分:0)

&#34; Vertex* v = new Vertex我被告知我不必担心删除这些指示。&#34;

嗯,他们是原始指针。您必须担心删除它们。但通常最简单的解决方案是将所有顶点放在Graph类中,让它拥有所有内容,而不必担心节点级别的所有权。

如果您将图形切成两半,或者正在执行可能将图形切成两半的操作,那么事情会变得有点毛茸茸。但即便如此,通常也不会有太难从旧Graph中提取新Graph的操作,并将受影响的节点传输到新的图形。