c++ - क्यों compilers गतिशील आवंटित स्मृति को हटाने के बाद स्वचालित रूप से सूचक चर करने के लिए नल निर्दिष्ट नहीं है?




null new-operator (3)

  1. यह अक्सर अनावश्यक होगा, खासकर अच्छी तरह से लिखित कोड में।

  2. यह बग को छिपा सकता है

  3. delete p; यदि वह अपने तर्क को संशोधित करता है तो वाक्य-रचनात्मक रूप से स्वतंत्र होगा।

पर (1) यह विशेष रूप से std::unique_ptr साथ बेकार होगा।

दूसरे शब्दों में, यदि आवश्यक हो तो इस नौकरी के साथ प्रोग्रामर पर बोझ करना सही काम है।

इस सवाल का पहले से ही उत्तर दिया गया है:

मेरे पास कोड का छोटा टुकड़ा है:

#include <iostream>
using namespace std;

int main() 
{
    int *p = new int(10);

    if(p != NULL)
    {
        cout<<"Deleted dynamic allocated memory"<<endl;
        delete p;
    }

    if(p == NULL)
    {
        cout<<"NULL"<<endl;
    }
    else
    {
        cout<<"Not NULL"<<endl;
    }
    return 0;
}

हटाए गए ऑपरेटर का उपयोग करके डायनामिक आवंटित स्मृति को हटाने के बाद, क्यों कंपलर्स को नल को पॉइंटर (जैसे p = NULL) स्वचालित रूप से असाइन नहीं किया जाता?


उन्हें ऐसा करने की अनुमति है, लेकिन यह अनिवार्य नहीं है मुझे लगता है कि इसका कारण यह नहीं है कि किसी भी तरह आप इस पर भरोसा कर सकते हैं। उदाहरण के लिए इस पर विचार करें:

int* a = new int(3);
int* b = a;
delete a;
/// ....
if (b != 0) {              /// assume b is either null or points to something valid
     std::cout << *b;      /// ups 
}

यदि आपका डिज़ाइन एक संकेतक को इंगित करने के लिए कहता है कि यह उपयोगी नहीं है, तो आप ऐसा करने के लिए कोड जोड़ सकते हैं। लेकिन यह डिफ़ॉल्ट नहीं होना चाहिए, क्योंकि यह अपर्याप्त और बेकार हो सकता है

शून्य संकेतक हर संभावित समस्या का समाधान नहीं करते हैं:

int *ip = new int;
int *ip1 = ip;
delete ip;
if (ip1)
    *ip1 = 3; // BOOM!

और वे अक्सर व्यर्थ होते हैं:

struct s {
    int *ip;
    s() : ip(new int) {}
    ~s() { delete ip; } // nobody cares if ip is NULL, 'cause you can't see it
};






delete-operator