【发布时间】:2016-05-17 19:21:59
【问题描述】:
我在理解以下 cmets 中提到的问题时遇到了一些问题:
class Node {
public:
Node(int value): value(value), neighbors() {}
int value;
std::vector<std::shared_ptr<Node>> neighbors;
};
std::vector<Node> nodes;
nodes.reserve(50);
for(int j = 0 ; j < 50; ++j) {
nodes.push_back(Node(j));
}
for(int j = 1 ; j < 25; ++j) {
nodes.at(0).neighbors.push_back(std::make_shared<Node>(nodes.at(j)));
}
//The following line is copying nodes.at(0) instead of just
//copying a reference to nodes.at(0). Why?
nodes.at(15).neighbors.push_back(std::make_shared<Node>(nodes.at(0)));
for(int j = 25 ; j < 50; ++j) {
nodes.at(0).neighbors.push_back(std::make_shared<Node>(nodes.at(j)));
}
std::cout << nodes.at(15).neighbors.at(0).neighbors.size();
//Prints out 24
std::cout << nodes.at(0).neighbors.size();
//Prints out 49
为什么下面的行复制nodes.at(0)(它返回对节点向量第一个元素的引用)而不是存储对它的引用?
nodes.at(15).neighbors.push_back(std::make_shared<Node>(nodes.at(0)));
【问题讨论】:
-
这就是它应该工作的方式。顺便说一句:为了让您的问题更准确,请查看
push_back或make_shared是否实际上复制了您的节点。 -
你怎么知道它被复制了?您知道
std::make_shared<Node>将创建一个Node实例,并调用新对象copy-constructor 以使用来自nodes.at(0)的节点对其进行初始化?是你说的复制构造吗? -
你知道
std::make_shared是做什么的吗? -
见这里:en.cppreference.com/w/cpp/memory/shared_ptr/make_shared
This function is typically used to replace the construction std::shared_ptr<T>(new T(args...)) -
请注意,如果您打算在此之后向
nodes添加更多节点,则根本无法存储指向节点的指针!那是因为vector被允许分配新的Nodes,将旧的复制/移动到新的,然后删除旧的,任何指向旧的指针都会失效。
标签: c++ pointers vector shared-ptr