2015-12-14 62 views
5

爲什麼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"; 
} 
+0

@prestokeys:看來你正在慢慢期待代碼充當這樣的文本方式複製參數表達式到每個元素構造一個*宏*。但情況並非如此;該表達式被評估*一次*並綁定到構造函數參數。我想這就是表達式評估和宏之間的區別,這就是爲什麼擁有宏仍然很好。像Scheme這樣的語言可以讓你做到這一點。 –

回答

12

你的矢量包含原始共享指針的五個人副本中,一個單一指針對象的所有共享所有權。

要創建五個不同的對象,通過一個共享的指針每個擁有它這樣寫:

std::vector<std::shared_ptr<Node>> nodes; 
for (int i = 0; i != 5; ++i) nodes.push_back(std::make_shared<Node>()); 
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>);