2012-12-10 17 views
20
buffer = new char[64]; 
buffer = std::make_shared<char>(char[64]); ??? 

क्या आप make_shared<>() का उपयोग कर किसी सरणी में स्मृति आवंटित कर सकते हैं?क्या आप make_shared के बराबर कुछ के साथ एक सरणी आवंटित कर सकते हैं?

मैं कर सकता: buffer = std::make_shared<char>(new char[64]);

लेकिन वह अभी भी नए बुला शामिल है, यह मेरी समझ करने के लिए make_shared सुरक्षित और अधिक कुशल है।

+3

'std :: वेक्टर बफर (64); ' –

उत्तर

19

make_shared की बात साझा सूचक का नियंत्रण ब्लॉक में कामयाब वस्तु को शामिल करने की है,

जब से तुम, साथ सी ++ 11 काम कर रहे शायद एक सी ++ 11 सरणी का उपयोग कर अपने लक्ष्यों को पूरा होगा ?

#include <memory> 
#include <array> 
int main() 
{ 
    auto buffer = std::make_shared<std::array<char, 64>>(); 
} 

ध्यान दें कि आप एक साझा सूचक, एक सूचक आप नए [] से प्राप्त होता है के रूप में एक ही तरह से उपयोग नहीं कर सकते क्योंकि std::shared_ptr (std::unique_ptr के विपरीत, उदाहरण के लिए) operator[] प्रदान नहीं करता है। आपको इसे अव्यवस्थित करना होगा: (*buffer)[n] = 'a';

+0

क्यों, हाँ यह होगा। मैंने कभी भी नई सी ++ 11 चाल सीखना बंद नहीं किया ... –

+0

मैं संकलन समय पर सरणी के आकार को निर्दिष्ट नहीं कर सकता हूं? –

+2

@JoshElias आप निश्चित रूप से समय संकलित कर सकते हैं। क्या आपका मतलब रनटाइम है? इसके लिए आपकी खुद की कक्षा की आवश्यकता होगी जो कि कन्स्ट्रक्टर तर्क के रूप में सरणी आकार लेता है, क्योंकि 'make_shared ' 'टी' के निर्माता को इसके रनटाइम तर्कों को आगे बढ़ाता है। या बस एक साझा वेक्टर बनाओ। – Cubbi

1

इस बारे में कैसे?

template<typename T> 
inline std::shared_ptr<T> MakeArray(int size) 
{ 
    return std::shared_ptr<T>(new T[size], [](T *p){ delete [] p; }); 
} 

auto buffer = new char[64]; 
auto buffer = MakeArray<char>(64); 
+0

नया 'shared_ptr' बनाने और' make_shared' का उपयोग करने के बीच एक अंतर है, बाद में 1 कम परमाणु ऑपरेशन होता है और जब भी संभव हो इसे प्राथमिकता दी जाती है। – SagiLow

2

क्या आपको आवंटित स्मृति को साझा करने की आवश्यकता है? आप एक std::unique_ptr बजाय का उपयोग करें और पर std::make_unique उपलब्ध कर सकते हैं सी ++ 14:

auto buffer = std::make_unique<char[]>(64); 

एक std::make_shared संस्करण उपलब्ध सी ++ 20 में किया जाएगा:

auto buffer = std::make_shared<char[]>(64); 
संबंधित मुद्दे

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