2012-02-16 11 views
7

क्या स्थानीय वेरिएबल से भरे वेक्टर को वापस सुरक्षित करना सुरक्षित है?स्थानीय चर के साथ आबादी वाले वेक्टर को वापस करने के लिए सुरक्षित?

उदाहरण के लिए, अगर मैं है ...

#include <vector> 

struct Target 
{ 
public: 
    int Var1; 
    // ... snip ... 
    int Var20; 
}; 


class Test 
{ 
public: 
    std::vector<Target> *Run(void) 
    { 
     std::vector<Target> *targets = new std::vector<Target>; 
     for(int i=0; i<5; i++) { 
      Target t = Target(); 
      t.Var1 = i; 
      // ... snip ... 
      t.Var20 = i*2; // Or some other number. 
      targets->push_back(t); 
     } 
     return targets; 
    } 


}; 

int main() 
{ 
    Test t = Test(); 
    std::vector<Target> *container = t.Run(); 

    // Do stuff with `container` 
} 

इस उदाहरण में, मैं पाश के लिए एक में एक से अधिक बना रहा हूं Target उदाहरणों, उन्हें वेक्टर के लिए जोर दे रहा है, और यह करने के लिए एक सूचक लौटने। चूंकि Target उदाहरण स्थानीय रूप से आवंटित किए गए थे, तो क्या इसका मतलब यह है कि लौटा वेक्टर असुरक्षित है क्योंकि यह स्टैक पर ऑब्जेक्ट्स का जिक्र कर रहा है (जिसे जल्द ही ओवरराइट किया जा सकता है)? यदि हां, तो वेक्टर वापस करने का अनुशंसित तरीका क्या है?

मैं इसे सी ++ में लिख रहा हूं, वैसे भी।

+0

संभवतः डुप्लिकेट [सी ++ में वेक्टरों की गतिशील मेमोरी आवंटन] (http://stackoverflow.com/questions/9252523/dynamic-memory-allocation-of-vectors-in-c) –

उत्तर

14

तत्व push_back उन्हें एक वेक्टर (या तत्वों को असाइन) में कॉपी करते हैं। आपका कोड इसलिए सुरक्षित है - वेक्टर में तत्व स्थानीय चर के लिए कोई संदर्भ नहीं हैं, वे वेक्टर के स्वामित्व में हैं।

इसके अलावा, आपको पॉइंटर वापस करने की भी आवश्यकता नहीं है (और कभी कच्चे पॉइंटर्स को संभाल लें, इसके बजाए स्मार्ट पॉइंटर्स का उपयोग करें)। इसके बजाए बस एक प्रतिलिपि वापस करें; संकलक इसे अनुकूलित करने के लिए पर्याप्त स्मार्ट है ताकि कोई वास्तविक अनावश्यक प्रतिलिपि नहीं बनाई जा सके।

+2

मैं कभी नहीं कहूंगा कच्चे पॉइंटर्स - सबकुछ इसकी जगह है। हालांकि, एक प्रतिलिपि न होने वाले मूल्य से लौटने से अब नए सी ++ 11 मानक के आधिकारिक धन्यवाद और रचनाकारों को स्थानांतरित किया जा सकता है। – Carl

+2

@carleeto: यह वर्षों (एन) आरवीओ के साथ आधिकारिक रहा है। – ildjarn

+0

मैंने जीसीसी 3.1 में आरवीओ के बाद रिटर्निंग पॉइंटर्स के साथ परेशान करना बंद कर दिया :) हालांकि, * "कच्चे पॉइंटर्स को कभी संभालें" *? मैं इस पर कार्लीटो के साथ जाऊंगा और आपसे असहमत हूं, उनके पास उनका उपयोग है। लेकिन हे, वैसे भी +1। – netcoder

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