[ad_1]
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
#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[^].
[ad_2]
コメント