用C ++直接构造函数调用

时间:2014-01-20 10:12:33

标签: c++

我有一个函数和一个类如下

class Vertex {
public:
    int mId;
public:
    Vertex(int info=-1) : mId(info) {

    }
};

class Edge {
public:
    Vertex mStart, mEnd;
    int mWeight;
public:
    Edge(Vertex start=-1, Vertex end=-1, int wt=-1) :
        mStart(start), mEnd(end), mWeight(wt) {
    }
};

class Graph {
    void addEdge(const Edge& e) {
        //Adds this edge to a vector
    }
};

shared_ptr<Graph> mygraph(new Graph(13 //no of vertices
                             , 17   //no of edges
                             , false));

mygraph->addEdge(Edge( 1, 2, 1));
mygraph->addEdge(Edge( 3, 1, 1));
mygraph->addEdge(Edge( 1, 6, 2));
mygraph->addEdge(Edge( 1, 7, 4));
...

这里我在构造函数中传递直接Edge值并且没有崩溃。但我想这里会有内存泄漏。在构建之后,通过引用传递对象的正确方法是什么?

PS:假设Vertex是一个隐式构造函数,接受int作为id。

1 个答案:

答案 0 :(得分:3)

不会有任何内存泄漏,将自动调用析构函数,如@Borgleader所写

  

你没有使用new作为边缘 - &gt;没有内存泄漏   如果你没有命名对象,那并不意味着它们不会被销毁。一切都还好。

虽然如果使用C ++ 11,可以执行一些优化。在您的代码对象中创建Edge,然后通过const引用传递给函数addEdge(),在那里它将被复制到带有复制构造函数的向量。您可以使用std::vector::emplace_back来避免这种开销!和模板。像这样:

class Graph {
    public:
    template<class... Args>
    void addEdge(Args&& ...args) {
        //Assuming vector is std::vector<Edge>
        vector.emplace_back(args...);
    }
};
mygraph->addEdge(1, 2, 1);

当清除矢量时,所有创建的对象都会被自动销毁。

而且,顺便说一句,如果您怀疑程序是否有内存泄漏,Valgrind随时为您服务!

更新

我编写了一个显示差异的小而简单的示例,请参阅http://ideone.com/ARzhL2。您可以直接滚动到stdout部分以查看结果。

相关问题