2016-06-22 5 views
9

इस कोड पर विचार करें? या फिर इसे वैध रूप से x=5; जैसे मान को असाइन करने के लिए उपयोग किया जा सकता है?क्या एक संदर्भ बाध्यकारी वास्तव में ऑपरेंड का मूल्यांकन करता है? कारण अप्रारंभीकृत चर पढ़ने के लिए यूबी के लिए अग्रणी</p> <pre><code>int& x=*new int; </code></pre> <p>करता है वास्तव में नव निर्मित संकेतक भिन्नता असाइनमेंट की आरएचएस,:

+2

यह वैध कोड है और जब तक आप किसी उद्देश्य के लिए अनियमित चर का उपभोग करने के बजाय कुछ मूल्य के साथ 'x' प्रारंभ करते हैं, तब तक सुरक्षित है। बेहतर चीज 'int और x = * नई int()' होगी जो इसे शून्य मूल्य के साथ भी आरंभ करेगी। और आवंटित स्मृति को हटाने के लिए आप चाहते हैं। – Arunmu

+4

मुझे नहीं लगता कि यह 'int y से अलग है; int और x = y; ', जो तब होता है जब आप 'int y करते हैं; std :: cin >> y; ' – dyp

उत्तर

6

जहां तक ​​मैं कह सकता हूं, आपने जो भी किया है, उनमें से कोई भी अपरिभाषित व्यवहार शामिल नहीं है।

हालांकि, यह तुरंत स्मृति रिसाव का खतरा पैदा करता है। इसे जल्दी से हल किया जा सकता है (चूंकि लीक मेमोरी के पते को हल करेगा, और इसलिए हटाया जा सकता है) लेकिन यदि आप गुंजाइश छोड़ना चाहते हैं, तो आपके पास उस पॉइंटर को पुनर्प्राप्त करने का कोई तरीका नहीं होगा।

संपादित करें: बात करने के लिए,

int& x=*new int; 
x = 5; 

std::cout << x << std::endl; 

std::cin >> x; 

std::cout << x << std::endl; 

कोड कैसा व्यवहार करेंगे लिखने के लिए अगर आप थे जैसे कि आप बस, एक्स के रूप में int x; की घोषणा की थी, सिवाय इसके कि सूचक भी बाद कार्यक्रम दायरे से बाहर निकल गया झूलते रह जायेंगे ।

यदि आप इसे मूल्य निर्दिष्ट करने से पहले अनियंत्रित चर को पढ़ने का प्रयास करना चाहते हैं, तो आप अपरिभाषित व्यवहार प्राप्त करेंगे, लेकिन अगर x आवंटित किया गया तो यह असत्य नहीं होगा।

+1

@ बेंजामिन लिंडले ने भाषा को" मेमोरी रिसाव के * जोखिम * बनाने "के लिए संशोधित किया। और कारण यह है कि मैं इसे पहली जगह में एक स्मृति रिसाव कह रहा हूं क्योंकि अपने आप पर, कोड में स्मृति में उपयोगकर्ता-दृश्य सूचक नहीं होता है। – Xirema

0

मैं ऐसा करने की सलाह नहीं दूंगा। एक वैरिएबल के साथ गतिशील स्मृति को क्षैतिज लग रहा है जो स्थिर दिखता है मेरे लिए खतरनाक लगता है। निम्नलिखित कोड

#include <iostream> 

int* dynamicAlloc() { 
    int& x = *new int; 
    std::cout << "Inside dynamicAlloc: " << x << std::endl; 
    std::cout << "Modified: " << (x = 1) << std::endl; 
    return &x; 
} 

int main() { 
    int *dall = dynamicAlloc();; 

    std::cout << "dall (address): " << dall << std::endl; 
    std::cout << "dall -> " << *dall << std::endl; // Memory not cleaned 

    delete dall; // Don't forget to delete 

    return 0; 
} 

पर विचार करें मैं इस तरह उत्पादन मिलता है:

Inside dynamicAlloc: -842150451 
Modified: 1 
dall (address): 00F642A0 
dall -> 1 

नोट कैसे अपसंदर्भन dall एक segfault में परिणाम नहीं करता है। एक्स को दायरे से बाहर होने पर इसे हटा दिया नहीं गया था। अन्यथा एक segfault संभवतः हुआ होगा।

अंत में:

int& x गतिशील आबंटित स्मृति के लिए एक उपनाम एक्स बनाता है। आप वैध रूप से उस मेमोरी को संशोधित कर सकते हैं, लेकिन यह साफ़ नहीं होगा क्योंकि यह संभावित मेमोरी लीक की वजह से आसानी से गुंजाइश से बाहर हो जाता है।

+0

मुझे यह नहीं मिला। बेशक आप हटाए जाने के बाद एक पॉइंटर का उपयोग नहीं कर सकते हैं। ओपी के लिए एकमात्र जोखिम यह है कि अगर मेमोरी ठीक से संभाला नहीं जाता है तो यह रिसाव हो सकता है। – NathanOliver

+0

मुख्य उद्देश्य यह था कि 'x'' परीक्षण() 'में दायरे से बाहर होने के बाद पते को आवंटित नहीं किया गया है। यदि आप सामानों को सही तरीके से प्रबंधित करते हैं, तो आप बाद में 'x' को हटा सकते हैं, लेकिन यह सहज नहीं है। एक बार जब मैं काम बंद कर दूं तो मैं फिर से शब्द कैसे लिखूंगा – Assimilater

+0

उम्मीद है कि शब्द अब थोड़ा बेहतर है – Assimilater

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

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