Copie el puntero en un vector cuando elimino el puntero

programación


m_vBol.push_back(pbol);

delete pbol;

con este código mi vector tiene puntero nulo, creo que por eso borro pbol, pero debo borrarlo, ¿cómo puedo hacer?

Lo que he probado:

Intenté buscar en internet porque no lo soluciono.

Solución 1

Sólo para agregar a lo que 0x01AA ha dicho, muy acertadamente,…
Copiar un puntero hace precisamente eso: hace una copia de la dirección de un artículo, no una copia del artículo.
Y cuando llamas delete en un puntero a un elemento de memoria, la memoria que estaba usando se devuelve al grupo de almacenamiento dinámico para su reutilización, lo que significa que cualquier copia de la dirección ahora puede apuntar a una estructura totalmente diferente.

Por ejemplo, si asigna una matriz de 5 enteros, copia el puntero, lo elimina y luego asigna una matriz de 100 flotantes, la copia del puntero puede acceder a la matriz flotante y codificar los datos de otro código.

Si necesita eliminar un puntero, es su responsabilidad asegurarse de que ya no esté en uso, de que no haya copias del puntero a las que se pueda acceder posteriormente; de ​​lo contrario, pueden comenzar a aparecer errores tremendamente impredecibles en código no relacionado.

Solución 2

El siguiente código

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";
}

producido

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

en mi máquina Linux (podría ser peor).

Mira esto punteros inteligentes – cppreference.com[^].

コメント

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