gpt4 book ai didi

c++ - C++中的直接构造函数调用

转载 作者:行者123 更新时间:2023-11-30 02:49:23 24 4
gpt4 key购买 nike

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

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 的隐式构造函数。

最佳答案

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

You didn't use new for the edges -> no memory leak If you don't name objects it doesn't mean they wouldn't be destroyed. Everything's okay.

尽管如果您使用的是 C++11,您可以进行一些优化。在您的代码中,对象 Edge 被创建,然后通过常量引用传递给函数 addEdge(),它将被复制到带有复制构造函数的 vector 中。您可以通过使用 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);

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

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

更新:

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

关于c++ - C++中的直接构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21231195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com