[c++] सी ++ में संदर्भ द्वारा एक सूचक को पास करने का कारण?



2 Answers

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

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

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

Question

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

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

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



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

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

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




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

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 (ऑब्जेक्ट * आइटम) हस्ताक्षर का उपयोग करते हैं तो आपके पास पॉइंटर की प्रति है, मूल नहीं।






Related