J'ai alloué un pointeur avec un nouvel opérateur et attribué la propriété de la mémoire à un nouveau unique_ptr. Dois-je supprimer le pointeur alloué avec new? Y a-t-il une fuite de mémoire ici?
#include <iostream> #include <memory> using namespace std; int main() { int *a = new int; *a = 5; std::unique_ptr<int> auptr; auptr.reset(a); int *b = auptr.get(); cout << *b << endl; cout << *a << endl; return 0; }
3 Réponses :
Non. unique_ptr
est maintenant propriétaire et il est désalloué lorsqu'il est hors de portée.
Lorsque votre code atteint return
, vous avez trois pointeurs ( a
, auptr
et b
) pointant vers le même objet, qui a été alloué par new
. Après le retour, auptr
sera hors de portée et son destructeur désallouera l'objet, vous n'avez donc pas à le faire manuellement et il n'y a pas de fuite de mémoire.
Notez simplement que votre code semble être une mauvaise utilisation de unique_ptr
. Vous créez initialement un pointeur brut et obtenez un autre pointeur brut à partir d'un pointeur intelligent intermédiaire. Pensez à utiliser std :: make_unique
et se débarrasser des pointeurs bruts.
La propriété a été transférée à unique_ptr
auptr
et la désallocation est désormais sous la responsabilité de unique_ptr
.
Vous pouvez tester si la mémoire qui est allouée est également désallouée avec quelques modifications à votre programme.
Creating new Int... Int... Created at 0x234ec30 Calling delete for Int object... Deleting at 0x234ec30 ~Int...
Sortie:
#include <iostream> #include <memory> struct Int { Int() { std::cout << "Int...\n"; } ~Int() { std::cout << "~Int...\n"; } }; struct D { void operator() (Int* p) { std::cout << "Calling delete for Int object... \n"; std::cout << "Deleting at " << p << '\n'; delete p; } }; int main() { std::cout << "Creating new Int...\n"; Int* i = new Int(); std::cout << "Created at " << i << '\n'; std::unique_ptr<Int, D> UPInt; UPInt.reset(i); }
Vous pouvez voir que l'objet créé à un certain emplacement est également en cours de suppression.
Voir DÉMO
Non. Comme vous l'avez dit, la propriété a été transférée à
unique_ptr
.L'objet pointé est la ressource détenue. Si vous le désallouez, il n'y a plus rien à posséder .