2017-05-11 18 views
9

getAName(getA().get()) जैसे फ़ंक्शन पैरामीटर को पास करना सुरक्षित है? getA() एक ऑब्जेक्ट unique_ptr<A> लौटाएं।सी ++: क्या यह एक तर्क पारित करने के लिए सुरक्षित है जैसे unique_ptr :: get() फ़ंक्शन

मैं वीएस 2010 पर नीचे दिए गए पूरे कोड के साथ परीक्षण करता हूं, यह काम करता है। लेकिन मैं यह सुनिश्चित करना चाहता हूं कि यह सी ++ मानक है, क्या यह अन्य सी ++ कंपाइलर्स के साथ सुरक्षित है?

#include "stdafx.h" 
#include <memory> 
#include <iostream> 

using namespace std; 

class A 
{ 
public: 
    A(){ cout<<"A()"<<endl;} 
    ~A(){ cout<<"~A()"<<endl;} 

    string name() { return "A"; } 
}; 

std::unique_ptr<A> getA() 
{ 
    return std::unique_ptr<A>(new A());; 
} 

void getAName(A* a) 
{ 
    if(a) 
    { 
     cout << a->name().c_str() << endl; 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    getAName(getA().get()); 
    return 0; 
} 

कंसोल में आउटपुट हैं:

A() 
A 
~() 

यह सब compilers के लिए नीचे के रूप में सुरक्षित के लिए कोड बनाने के लिए आवश्यक है?

unique_ptr<A> a = getA(); 
getAName(a.get()); 
+1

c_str() यदि आप cout – Kapil

उत्तर

7

यह सुरक्षित है। getA()temporarystd::unique_ptr देता है, जो पूर्ण अभिव्यक्ति के बाद नष्ट हो जाएगा, जिसमें getAName() का आविष्कार होता है। तो getAName() के शरीर के अंदर पॉइंटर पास वैध रहता है।

सभी अस्थायी वस्तुओं पूर्ण अभिव्यक्ति है कि (lexically) बिंदु है जहां वे बनाए गए थे, शामिल हैं का मूल्यांकन करने में अंतिम चरण के रूप में नष्ट कर रहे हैं ...

नोट सूचक पारित कर दिया है, तो है कि में कहीं भी संग्रहीत (उदाहरण के लिए एक वैश्विक चर) और फिर बाद में उपयोग किया जाता है (यानी getAName() के आवेषण के बाद), पॉइंटर द्वारा इंगित ऑब्जेक्ट अस्थायी std::unique_ptr द्वारा नष्ट कर दिया गया है और सूचक लटक गया है; तो उस पर सम्मान UB होगा। यदि यह मामला है, जैसा कि आपने दिखाया है, तो आपको इसके लिए नामित चर की आवश्यकता हो सकती है।

+0

बीटीडब्ल्यू का उपयोग कर रहे हैं तो यूबी का क्या अर्थ है? – Kapil

+0

@ कैपिल [अपरिभाषित व्यवहार] (https://en.wikipedia.org/wiki/Undefined_behavior)। – songyuanyao

+0

क्या यह सेगमेंटेशन गलती नहीं होगी (एसआईजीएसईवी) – Kapil

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

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