智能指针析构函数调用的向量
Vector of smart pointers destructor call
为什么在下面的代码中节点析构函数只被调用一次而不是 5 次?
#include <iostream>
#include <vector>
#include <memory>
struct Node {
~Node() {std::cout << "Node destructor called.\n";}
};
void foo() {
std::vector<std::shared_ptr<Node>> nodes(5, std::make_shared<Node>());
}
int main() {
foo();
std::cout << "foo() ended.\n";
}
您的向量包含原始共享指针的五个副本,所有共享一个指针对象的所有权。
要创建五个独立的对象,每个对象由一个共享指针拥有,可以这样写:
std::vector<std::shared_ptr<Node>> nodes;
for (int i = 0; i != 5; ++i) nodes.push_back(std::make_shared<Node>());
explained the situation well, but to do what you want to do in a different way, you could also the std::generate_n
算法:
std::vector<std::shared_ptr<Node>> nodes;
std::generate_n(
std::back_inserter(nodes),
5,
std::make_shared<Node>);
这更符合您最初的想法。
或者,类似地:
std::vector<std::shared_ptr<Node>> nodes(5);
std::generate(nodes.begin(), nodes.end(), std::make_shared<Node>);
为什么在下面的代码中节点析构函数只被调用一次而不是 5 次?
#include <iostream>
#include <vector>
#include <memory>
struct Node {
~Node() {std::cout << "Node destructor called.\n";}
};
void foo() {
std::vector<std::shared_ptr<Node>> nodes(5, std::make_shared<Node>());
}
int main() {
foo();
std::cout << "foo() ended.\n";
}
您的向量包含原始共享指针的五个副本,所有共享一个指针对象的所有权。
要创建五个独立的对象,每个对象由一个共享指针拥有,可以这样写:
std::vector<std::shared_ptr<Node>> nodes;
for (int i = 0; i != 5; ++i) nodes.push_back(std::make_shared<Node>());
std::generate_n
算法:
std::vector<std::shared_ptr<Node>> nodes;
std::generate_n(
std::back_inserter(nodes),
5,
std::make_shared<Node>);
这更符合您最初的想法。
或者,类似地:
std::vector<std::shared_ptr<Node>> nodes(5);
std::generate(nodes.begin(), nodes.end(), std::make_shared<Node>);