聪明的尖destructor电话传染媒介

pre*_*eys 5 c++ smart-pointers c++11

为什么在下面的代码中只调用一次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";
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 12

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

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

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