2011-12-24 6 views
24

मुझे अक्सर सी ++ में गतिशील रूप से आवंटित सरणी से निपटने की आवश्यकता होती है, और इसलिए स्कॉप्ड_एरे, साझा_एरे, और इसी तरह के बूस्ट पर भरोसा करते हैं। Stroustrup's C++11 FAQ और C++11 Reference Wiki के माध्यम से पढ़ने के बाद, मुझे C++ 11 मानक द्वारा प्रदान की गई इन गतिशील सरणी रैपरों के लिए उपयुक्त प्रतिस्थापन नहीं मिला। क्या ऐसा कुछ है जिसे मैंने अनदेखा किया है, या क्या मुझे बूस्ट पर भरोसा करना जारी रखना है?क्या सी ++ 11 में बूस्ट के स्कोप्ड_एरे जैसे गतिशील रूप से आवंटित सरणी के लिए रैपर हैं?

आपकी मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

43

का एक विशेषज्ञता है, जैसे unique_ptr<T[]>

#include <iostream> 
#include <memory> 

struct test 
{ 
    ~test() { std::cout << "test::dtor" << std::endl; } 
}; 

int main() 
{ 
    std::unique_ptr<test[]> array(new test[3]); 
} 

जब आप इसे चलाते हैं, तो आपको यह संदेश मिलेंगे।

test::dtor 
test::dtor 
test::dtor 

आप shared_ptr का उपयोग करना चाहते हैं, तो आप Deleter के लिए std::default_delete<T[]> का उपयोग के बाद से यह shared_ptr<t[]> की तरह एक नहीं है चाहिए।

std::shared_ptr<test> array(new test[3], std::default_delete<test[]>()); 
+0

धन्यवाद, बस मैं जो देख रहा था! मुझे नहीं पता था कि सरणी के लिए एक विशेषज्ञता थी। –

0

जहां तक ​​वैक्टर सरणी रैपर, क्या हुआ अगर आप आंतरिक वस्तु के रूप में वेक्टर के साथ किसी भी उपयुक्त स्मार्ट सूचक का उपयोग के रूप में इरादा कर रहे हैं?

+0

वेक्टर :: emplace_back() और वेक्टर :: push_back() तत्व प्रकार प्रति-रचनात्मक नहीं होने पर काम नहीं करेगा। मुझे प्रारंभकर्ता सूची के साथ प्रारंभ करने के बारे में पता नहीं है, लेकिन मुझे संदेह है कि एक ही समस्या है। – Syncopated

+0

हाँ, आप सही हैं, उस स्थिति में हमें ऐसी गैर-प्रतिलिपि योग्य चीजों को अतिरिक्त रैपर के साथ लपेटने की ज़रूरत है, जो वास्तव में कुछ ओवरकिल हो जाता है :) –

संबंधित मुद्दे