[C++] C ++ में संदर्भ द्वारा एक पॉइंटर पास करने का कारण है?


Answers

50% सी ++ प्रोग्रामर अपने पॉइंटर्स को हटाए जाने के बाद रिक्त करने के लिए सेट करना चाहते हैं:

template<typename T>    
void moronic_delete(T*& p)
{
    delete p;
    p = nullptr;
}

संदर्भ के बिना, आप केवल कॉलर की स्थानीय प्रतिलिपि को बदलते हुए, कॉलर को प्रभावित नहीं करेंगे।

Question

किस परिस्थिति में आप इस प्रकृति का कोड c ++ में उपयोग करना चाहते हैं?

void foo(type *&in) {...}

void fii() {
  type *choochoo;
  ...
  foo(choochoo);
}



एक और स्थिति है जब आपको इसकी आवश्यकता हो सकती है, यदि आपके पास स्टेल संग्रह का संकेत है और उन्हें एसटीएल एल्गोरिथम का उपयोग करना चाहते हैं। For_each का उदाहरण c ++ 98

struct Storage {
  typedef std::list<Object*> ObjectList;
  ObjectList objects;

  void change() {
    typedef void (*ChangeFunctionType)(Object*&);
    std::for_each<ObjectList::iterator, ChangeFunctionType>
                 (objects.begin(), objects.end(), &Storage::changeObject);
  }

  static void changeObject(Object*& item) {
    delete item;
    item = 0;
    if (someCondition) item = new Object();
  } 

};

अन्यथा, यदि आप changeObject (ऑब्जेक्ट * आइटम) हस्ताक्षर का उपयोग करते हैं तो आपके पास पॉइंटर की प्रति है, मूल नहीं है




मुझे इस तरह से कोड का उपयोग करना पड़ा है जिसमें एक पॉइंटर को मेमोरी आवंटित करने के लिए कार्यों को प्रदान किया गया था और इसके आकार को वापस लौटा दिया था क्योंकि मेरी कंपनी ने "ऑब्जेक्ट" मुझे एसटीएल का उपयोग कर दिया था

 int iSizeOfArray(int* &piArray) {
    piArray = new int[iNumberOfElements];
    ...
    return iNumberOfElements;
 }

यह अच्छा नहीं है, लेकिन सूचक संदर्भ से पारित किया जाना चाहिए (या डबल सूचक का उपयोग करें)। यदि नहीं, तो पॉइंटर की स्थानीय प्रतिलिपि को स्मृति आवंटित की जाती है यदि यह मान से पारित हो जाती है जिसके कारण स्मृति रिसाव होता है।