انسخ المؤشر في متجه عندما أحذف المؤشر


m_vBol.push_back(pbol);

delete pbol;

مع هذا الرمز، يحتوي المتجه الخاص بي على مؤشر فارغ، وأعتقد أن هذا هو سبب حذف 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

على صندوق Linux الخاص بي (قد يكون الأمر أسوأ).

القي نظرة على المؤشرات الذكية – cppreference.com[^].

コメント

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