智能指针析构函数调用的向量

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>);