Copier le pointeur dans un vecteur lorsque je supprime le pointeur

la programmation


m_vBol.push_back(pbol);

delete pbol;

avec ce code mon vecteur a un pointeur nul, je pense que c’est pour ça que je supprime pbol, mais je dois le supprimer, comment puis-je faire ?

Ce que j’ai essayé :

J’ai essayé de chercher sur Internet parce que je n’ai pas résolu le problème

Solution 1

Juste pour ajouter à ce que 0x01AA a dit – à juste titre -…
C’est exactement ce que fait la copie d’un pointeur : elle crée une copie de l’adresse d’un élément, pas une copie de l’élément.
Et quand tu appelles delete sur un pointeur vers un élément de mémoire, la mémoire qu’il utilisait est renvoyée au pool de tas pour être réutilisée – ce qui signifie que toutes les copies de l’adresse peuvent désormais pointer vers une structure totalement différente.

Par exemple, si vous mallocez un tableau de 5 entiers, copiez le pointeur, supprimez-le, puis mallocez un tableau de 100 flottants, la copie du pointeur peut accéder au tableau flottant et brouiller les données d’un autre code.

Si vous devez supprimer un pointeur, il est de votre responsabilité de vous assurer qu’il n’est plus utilisé, qu’il n’y a aucune copie du pointeur accessible par la suite – sinon des erreurs extrêmement imprévisibles peuvent commencer à apparaître dans du code sans rapport !

Solution 2

Le code suivant

C++
#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";
}

produit

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

sur ma machine Linux (ça pourrait être pire).

Jettes un coup d’oeil à pointeurs intelligents – cppreference.com[^].

コメント

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