2016-04-20 10 views
9

दोनों स्केलर और सरणी का उपयोग स्मार्ट पॉइंटर में स्केलर और सरणी दोनों का उपयोग कैसे कर सकता हूं?स्मार्ट पॉइंटर

नए और हटाने के सूचक का उपयोग करने का पुराना तरीका:

std::unique_ptr<int> p1(new int); 
std::unique_ptr<int[]> p2(new int[10]); 

मैं कैसे करने के लिए कम कर सकते हैं:

int *p; 

if (useScalar) { 
    p = new int; 
} else { 
    p = new int[10]; 
} 

if (useScalar) { 
    delete p; 
} else { 
    delete[] p; 
} 

स्मार्ट सूचक में, मैं प्रत्येक अदिश और सरणी सूचक के लिए 2 संकेत का उपयोग करना केवल 1 स्मार्ट सूचक का उपयोग करें?

+0

आप अपनी खुद की स्मार्ट सूचक जो कि क्या 'delete' उपयोग करने के लिए या' हटाना [] 'निर्धारित करने के लिए एक 'bool useScalar' संग्रहीत करता है लिख सकते हैं। – jotik

+6

क्या आप 'p = new int [1]' आवंटित कर सकते हैं और नाटक कर सकते हैं कि यह स्केलर के लिए सूचक है? – dasblinkenlight

+2

आप 'int [1] 'स्केलर के रूप में उपयोग कर सकते हैं, शायद यह आपके प्रोग्राम के अन्य क्षेत्रों को भी सरल बनाता है ... – alain

उत्तर

5

यदि आप कस्टम डिलीटर का उपयोग करते हैं, तो आप एक ही प्रकार के पॉइंटर के लिए उपयोग कर सकते हैं।

std::unique_ptr<int, void(*)(int*)> p = {nullptr, [](int*){}}; 
if (useScalar) { 
    p = { 
     new int, 
     [](int* p){delete p;} 
    }; 
} else { 
    p = { 
     new int[10], 
     [](int* p){delete[] p;}, 
    }; 
} 
संबंधित मुद्दे