聪明的尖destructor电话传染媒介

时间:2015-12-14 18:43:08

标签: c++ c++11 smart-pointers

为什么在下面的代码中只调用一次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";
}

2 个答案:

答案 0 :(得分:12)

您的向量包含原始共享指针的五个副本,所有副本都共享一个单一指针的所有权。

要创建五个单独的对象,每个对象由一个共享指针拥有,请按以下方式编写:

std::vector<std::shared_ptr<Node>> nodes;
for (int i = 0; i != 5; ++i) nodes.push_back(std::make_shared<Node>());

答案 1 :(得分:1)

Kerrek SB很好地解释了这种情况,但要以不同的方式做你想做的事情,你还可以使用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>);