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 .