जब मैं पॉइंटर हटाता हूँ तो पॉइंटर को वेक्टर में कॉपी करें


m_vBol.push_back(pbol);

delete pbol;

इस कोड के साथ मेरे वेक्टर में शून्य सूचक है, मुझे लगता है कि इसीलिए मैं पीबोल हटाता हूं, लेकिन मुझे इसे हटाना होगा, मैं कैसे कर सकता हूं?

मैंने क्या प्रयास किया है:

मैंने इंटरनेट पर खोजने की कोशिश की क्योंकि मैं इसे हल नहीं कर पाया

समाधान 1

बस 0x01AA में जो कुछ है उसे जोड़ने के लिए – बिल्कुल सही – कहा गया है…
पॉइंटर की प्रतिलिपि बनाने से बस यही होता है – यह किसी आइटम के पते की प्रतिलिपि बनाता है, आइटम की प्रतिलिपि नहीं।
और जब आप कॉल करेंगे delete किसी मेमोरी आइटम के पॉइंटर पर जिस मेमोरी का वह उपयोग कर रहा था उसे पुन: उपयोग के लिए हीप पूल में वापस कर दिया जाता है – जिसका अर्थ है कि पते की कोई भी प्रतियां अब पूरी तरह से अलग संरचना को इंगित कर सकती हैं।

उदाहरण के लिए, यदि आप 5 पूर्णांकों की एक सरणी को मॉलोक करते हैं, पॉइंटर को कॉपी करते हैं, उसे हटाते हैं, और फिर 100 फ्लोट्स की एक सरणी को मॉलोक करते हैं, तो पॉइंटर की कॉपी फ्लोट सरणी तक पहुंच सकती है और अन्य कोड के डेटा को स्क्रैम्बल कर सकती है।

यदि आपको किसी पॉइंटर को हटाने की आवश्यकता है, तो यह सुनिश्चित करना आपकी ज़िम्मेदारी है कि यह अब उपयोग में नहीं है, पॉइंटर की कोई प्रतियां नहीं हैं जिन्हें बाद में एक्सेस किया जा सकता है – अन्यथा असंबंधित कोड में बेतहाशा अप्रत्याशित त्रुटियां दिखाई देनी शुरू हो सकती हैं!

समाधान 2

निम्नलिखित कोड

सी++
#include <iostream>
#include <vector>
using namespace std;

class Foo
{
  int m_value;
public:
  Foo(int i):m_value(i){}
  ~Foo(){ cout << "~Foo() called\n";}
  int get_value(){return m_value;}
};


int main()
{

  Foo * pfoo = new Foo(42);

  vector <Foo * > v;
  v.push_back(pfoo);

  cout << "pfoo " << pfoo << "\n";
  cout << "v[0] " << v[0] << "\n";
  cout << "v[0]->get_value() " << v[0]->get_value() << "\n";

  cout << "deleting pfoo\n";
  delete pfoo;
  cout << "setting pfoo=nullptr\n";
  pfoo = nullptr;

  cout << "pfoo " << pfoo << "\n";
  cout << "v[0] " << v[0] << "\n";
  cout << "v[0]->get_value() " << v[0]->get_value() << "\n";
}

उत्पादन

pfoo 0x55de79f86eb0
v[0] 0x55de79f86eb0
v[0]->get_value() 42
deleting pfoo
~Foo() called
setting pfoo=nullptr
pfoo 0
v[0] 0x55de79f86eb0
v[0]->get_value() 0

मेरे लिनक्स बॉक्स पर (यह और भी बुरा हो सकता है)।

क नज़र तो डालो स्मार्ट पॉइंटर्स – cppreference.com[^].

コメント

タイトルとURLをコピーしました