2
votes

Transfert de la propriété du pointeur brut vers unique_ptr

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


2 commentaires

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 .


3 Réponses :


5
votes

Non. unique_ptr est maintenant propriétaire et il est désalloué lorsqu'il est hors de portée.


0 commentaires

2
votes

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.


0 commentaires

1
votes

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


0 commentaires