我有一个函数和一个类如下
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。
答案 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
部分以查看结果。