2010-10-06 17 views
10

संभव डुप्लिकेट:
c++ warning: address of local variableलौटने पते या स्थानीय चर या अस्थायी सी ++ चेतावनी

हाय, जब मैं इस कोड को लिखें:

//Returns the transpose matrix of this one 
SparseMatrix& SparseMatrix::transpose()const{ 
    vector<Element> result; 
    size_t i; 
    for(i=0;i<_matrix.size();++i){ 
     result.push_back(Element(_matrix.at(i)._col, _matrix.at(i)._row, _matrix.at(i)._val)); 
    } 

    return SparseMatrix(numCol,numRow,result); 
} 

मैं चेतावनी मिलती है "वापसी का पता या स्थानीय चर या अस्थायी"। अंतिम पंक्ति स्पैर्समैट्रिक्स कन्स्ट्रक्टर को कॉल करती है। मुझे समझ में नहीं आता कि इस कोड के साथ क्या गलत है, और मैं इसे कैसे ठीक कर सकता हूं ताकि मैं एक स्पैरमैटिक्स ऑब्जेक्ट को वापस कर सकूं जैसा मैं चाहता हूं।

उत्तर

12

आप एक संदर्भ के लिए लौट रहे, न कि वास्तविक वस्तु - ध्यान दें & यहाँ:

SparseMatrix& SparseMatrix::transpose()const{ 

आप वास्तविक वस्तु वापस जाने के लिए, कि & निकाल दें।

अंतिम पंक्ति वास्तव में निर्माता को कॉल करती है, लेकिन यह परिणामी वस्तु को वापस नहीं करती है। वह ऑब्जेक्ट तुरंत नष्ट हो जाता है, और इसका अमान्य संदर्भ वापस आ जाता है।

+2

+1 "और" बेकार है (वास्तव में गलत है) यहां! – kartheek

+0

धन्यवाद! मैंने देखा नहीं है कि मैंने इसे एक रिफ रिटर्न वैल्यू के रूप में घोषित कर दिया है। – limlim

10

सी ++ में, स्थानीय चर 'दायरे से बाहर निकलने पर स्वचालित रूप से' नष्ट हो जाते हैं। आपका return कथन SparseMatrix प्रकार का नामहीन, अस्थायी चर बना देगा जो तुरंत दायरे से बाहर हो जाएगा। इसलिए, इसका संदर्भ लौटने से कोई फर्क नहीं पड़ता।

मूल्य से वापस जाना आसान हो सकता है: तो अस्थायी की एक प्रति वापस कर दी जाएगी। संकलक इसे दूर अनुकूलित कर सकते हैं (प्रतिलिपि प्रतिलिपि)।

तुम सच में एक समारोह से बाहर एक वस्तु पास करना चाहते हैं, तो आप यह ढेर पर बनाना चाहिए, new का उपयोग कर:

SparseMatrix* SparseMartix::transopse()const{ 


    //... 
    return new SparseMatrix(...); 

} 

लेकिन फिर भी, आप वापस आ वस्तु के जीवनकाल की देखभाल करने की जरूरत है स्वयं।

0

निर्माण 'टी()' एक अस्थायी प्रकार 'टी' बनाता है जो मूल रूप से एक लवल्यू (लेकिन एक रावल्यू) नहीं है।

$ 12,1/11 - "एक कार्यात्मक अंकन प्रकार रूपांतरण (5.2.3) किया जा सकता है अपनी तरह का नया वस्तुओं को बनाने [ नोट: वाक्य रचना निर्माता के स्पष्ट कॉल की तरह दिखता है।।

12 एक इस तरह से बनाई गई वस्तु अज्ञात है। [नोट: 12.2 के अस्थायी वस्तुओं> जीवन का वर्णन करता है अंत टिप्पणी।] [नोट: स्पष्ट निर्माता कॉल lvalues ​​उपज नहीं है, 3.10 को देखने के अंत टिप्पणी।] इस अस्थायी जीवनकाल पूर्ण अभिव्यक्ति का अंत है यानी अभिव्यक्ति के बाद समाप्ति अर्धविराम।

$ 12,2/3 - "अस्थाई वस्तुओं में अंतिम चरण पूर्ण अभिव्यक्ति (1.9) कि (lexically) बिंदु जहां वे शामिल होते हैं का मूल्यांकन के रूप में नष्ट कर रहे हैं। यह सत्य है, भले ही वह मूल्यांकन में अपवाद फेंक रहा हो।मूल्य संगणना और के साइड इफेक्ट एक अस्थायी वस्तु को नष्ट करने केवल पूर्ण अभिव्यक्ति के साथ जुड़े रहे हैं, किसी भी विशिष्ट उपसूचक साथ नहीं है। "

$ 12,2/5- 'एक अस्थायी के जीवनकाल के लिए बाध्य फ़ंक्शन रिटर्न स्टेटमेंट (6.6.3) में लौटाया गया मान विस्तारित नहीं है; अस्थायी के अंत में कथन में पूर्ण अभिव्यक्ति के अंत में नष्ट हो गया है। "

इसलिए आपका फ़ंक्शन एक स्मृति स्थान के संदर्भ को वापस करने का प्रयास करता है जिसका भंडारण अवधि पहले से खत्म हो चुका है और ऑब्जेक्ट नष्ट हो गया है।

इसलिए एक चेतावनी। ध्यान दें कि इस स्थिति को मानक द्वारा स्पष्ट रूप से निदान और इसलिए एक चेतावनी की आवश्यकता नहीं है।

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