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