संभव डुप्लिकेट लौटने नहीं बुलाया:
Why is the destructor not called for the returned object from the function?नाशक जब एक स्थानीय उदाहरण
मैं कुछ सी ++ कोड (नीचे) ने लिखा है, यह जीसीसी 4.6 के साथ संकलित और इसे सफलतापूर्वक भाग गया। लेकिन मुझे नहीं पता कि के विनाशक को createA()
से लौटने पर क्यों नहीं कहा जाता है।
ca
createA()
(यानी स्टैक पर) में एक स्थानीय चर है, मुझे लगता है कि फ़ंक्शन से लौटने पर इसके विनाशक को बुलाया जाना चाहिए। लेकिन वास्तव में, विनाशक को केवल 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;
}
यह अधिक सामान्य नाम के तहत भी जाता है: प्रतिलिपि प्रतिलिपि बनाएँ। –
असल में, यह आरवीओ का एक विशेष मामला है, जिसे नामित * रिटर्न वैल्यू ऑप्टिमाइज़ेशन कहा जाता है। – dirkgently
धन्यवाद ग्रिगोर। और मेरे पास एक और सवाल है: यदि स्थानीय क्लास वैरिएबल को वापस करना सुरक्षित है। क्या यह तकनीक, आरवीओ, एक सी ++ स्पेक या सिर्फ एक कंपाइलर ऑप्टिमाइज़ेशन चाल है? –