Get() के माध्यम से प्राप्त किए गए unique_ptr के कच्चे सूचक पर रीसेट() करना अपरिभाषित व्यवहार है, यह इस तरह है:

   std::unique_ptr<int> thing(new int(8));
   int* other = thing.get();
   other.reset(new int(15));

लेकिन क्या होगा यदि unique_ptr का कच्चा सूचक उसी प्रकार की वस्तु को इंगित कर सकता है? उदाहरण के लिए निम्नलिखित कोड दिया गया है:

class Node {
    public:
        std::unique_ptr<Node> previous;
        std::unique_ptr<Node> next;
        int data;        
        Node(int d) : previous(nullptr),
                      next(nullptr),   
                      data(d) {}
};

void some_function(std::unique_ptr<Node> node, Node* other_ptr) {
    Node* node_ptr = node.get();
    node_ptr->next.reset(other_ptr); // ***           
    ………………………………………………………………………………….
    ………………………………………………………………………………….
   // Some code. Please don't focus on the secondary things.
   // The main question whether it allowed to perform reset from line ****)
}

क्या यह अपरिभाषित व्यवहार भी है? यदि हाँ तो क्यों।

कोड का लिंक: कोड

-5
std_name 3 जुलाई 2019, 23:23

1 उत्तर

सबसे बढ़िया उत्तर

निम्नलिखित पूर्व शर्त के साथ, some_function का व्यवहार अच्छी तरह से परिभाषित है:

  • other_ptr को new का उपयोग करके आवंटित किया जाना चाहिए, और अभी भी मान्य होना चाहिए (हटाया नहीं गया)।
  • other_ptr का स्वामित्व 1 को फ़ंक्शन में स्थानांतरित कर दिया गया होगा यानी किसी और के पास इसका स्वामित्व नहीं है।
  • node खाली नहीं होना चाहिए।

हालांकि, node, सभी तर्कों की तरह, फ़ंक्शन के लिए स्थानीय है। जब फ़ंक्शन समाप्त होता है, node नष्ट हो जाता है। नतीजतन, वह जिस सूचक को प्रबंधित करता है उसे हटा दिया जाता है। इस प्रकार यह इंगित वस्तु को संशोधित करने के लिए व्यर्थ लगता है, जो कि फ़ंक्शन करता है।

1


पी.एस. next और previous पॉइंटर्स के साथ, Node एक डबल लिंक्ड लिस्ट की तरह दिखता है। हालाँकि, यह एक सूची नहीं हो सकती है, क्योंकि पिछले नोड और अगले नोड दोनों के पास वर्तमान नोड का अद्वितीय स्वामित्व नहीं हो सकता है।

पी.पी.एस. Node* node_ptr = node.get(); node_ptr->next.reset... को node->next.reset में सरल बनाया जा सकता है।

2
eerorika 3 जुलाई 2019, 23:48