2012-06-18 15 views
8

संभव डुप्लिकेट लौटने नहीं बुलाया:
Why is the destructor not called for the returned object from the function?नाशक जब एक स्थानीय उदाहरण

मैं कुछ सी ++ कोड (नीचे) ने लिखा है, यह जीसीसी 4.6 के साथ संकलित और इसे सफलतापूर्वक भाग गया। लेकिन मुझे नहीं पता कि के विनाशक को createA() से लौटने पर क्यों नहीं कहा जाता है।

cacreateA() (यानी स्टैक पर) में एक स्थानीय चर है, मुझे लगता है कि फ़ंक्शन से लौटने पर इसके विनाशक को बुलाया जाना चाहिए। लेकिन वास्तव में, विनाशक को केवल main फ़ंक्शन से लौटने पर एक बार बुलाया जाता है।

इसके अलावा, एक स्थानीय उदाहरण लौटने से हमेशा इस परीक्षण में ठीक काम करता है। मुझे आश्चर्य है कि लौटने के बाद फ्रेम को पॉप आउट होने पर स्थानीय स्टैक फ्रेम पर स्थानीय उदाहरण वापस करना सुरक्षित है।

#include <iostream> 
#include <string.h> 

class classA 
{ 
public: 
    classA() { len = 0; v = 0; } 

    classA(int a) 
    { 
     len = a; 
     v = new int[a]; 
     for (int i = 0; i < a; i++) 
      v[i] = 2*i; 
    } 

    ~classA() 
    { 
     if (v) 
      { 
      memset(v, 0, len * sizeof(int)); 
      delete [] v; 
     } 
    } 

    int *v; 
    int len; 
}; 

classA createA(int a) 
{ 
    classA ca(a); 
    return ca; 
} 

using namespace std; 

int main() 
{ 
    int a = 10; 
    classA ca = createA(a); 
    classA *pca = &ca; 
    for (int i = 0; i < a; i++) 
     cout << pca->v[i]; 
    cout << endl; 
    return 0; 
} 

उत्तर

14

यह वापसी मान अनुकूलन कहा जाता है:

यह मेरा कोड है।

संक्षेप में, संकलक को कोड को अनुकूलित करने के लिए ऑब्जेक्ट की एक प्रति वापस करने की आवश्यकता नहीं है।

सीए के लिए

नहीं जरूरी एक स्थानीय चर, स्टैक पर अर्थात है [...]। अतिरिक्त प्रतिलिपि को रोकने के लिए ca सीधे कॉलिंग संदर्भ में बनाया जा सकता है। कॉपी करें elision एकमात्र अनुकूलन है कि एक कंपाइलर ऐसा करने के लिए स्वतंत्र है जो अपेक्षित व्यवहार को बदल सकता है।

+1

यह अधिक सामान्य नाम के तहत भी जाता है: प्रतिलिपि प्रतिलिपि बनाएँ। –

+1

असल में, यह आरवीओ का एक विशेष मामला है, जिसे नामित * रिटर्न वैल्यू ऑप्टिमाइज़ेशन कहा जाता है। – dirkgently

+0

धन्यवाद ग्रिगोर। और मेरे पास एक और सवाल है: यदि स्थानीय क्लास वैरिएबल को वापस करना सुरक्षित है। क्या यह तकनीक, आरवीओ, एक सी ++ स्पेक या सिर्फ एक कंपाइलर ऑप्टिमाइज़ेशन चाल है? –