2015-12-14 14 views
5

नीचे कोड में 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: ऐसा लगता है कि आप किसी भी तरह कोड एक * मैक्रो * कि किसी तरह से टेक्स्ट प्रत्येक तत्व निर्माता में तर्क अभिव्यक्ति डुप्लिकेट की तरह काम करने के लिए उम्मीद कर रहे थे। लेकिन यह मामला नहीं है; अभिव्यक्ति का मूल्यांकन * एक बार * और कन्स्ट्रक्टर पैरामीटर से जुड़ा हुआ है। मुझे लगता है कि अभिव्यक्ति मूल्यांकन और मैक्रोज़ के बीच अंतर है, और यही कारण है कि मैक्रोज़ होना अभी भी अच्छा है। योजना जैसी भाषाएं आपको यह ठीक से करने देती हैं। –

उत्तर

12

आपका वेक्टर मूल साझा सूचक के पांच प्रतियां, एक ही pointee के सभी साझा करने के स्वामित्व में शामिल है।

पांच अलग-अलग वस्तुओं बनाने के लिए, हर एक साझा सूचक के स्वामित्व में है, यह इस प्रकार लिख:

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>); 
संबंधित मुद्दे