Передача владения необработанным указателем на unique_ptr - PullRequest
0 голосов
/ 29 января 2019

Я выделил указатель с новым оператором и назначил владение памятью для нового unique_ptr.Нужно ли удалять указатель, выделенный с помощью нового?Здесь есть утечка памяти?

#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 ]

0 голосов
/ 29 января 2019

Когда ваш код достигает return, у вас есть три указателя (a, auptr и b), указывающие на один и тот же объект, который был выделен new.После возврата auptr выйдет из области видимости, и его деструктор освободит объект, поэтому вам не нужно делать это вручную и нет утечек памяти.

Просто обратите внимание, что ваш код выглядит как неправильное использованиеunique_ptr.Сначала вы создаете необработанный указатель и получаете другой необработанный указатель из промежуточного промежуточного указателя.Попробуйте использовать std::make_unique и избавиться от необработанных указателей.

0 голосов
/ 29 января 2019

Владение было передано unique_ptr auptr, и освобождение теперь является обязанностью unique_ptr.

. Вы можете проверить, выделяется ли выделенная память также с помощьюнекоторые изменения в вашей программе.

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

Вывод:

Creating new Int...
Int...
Created at 0x234ec30
Calling delete for Int object... 
Deleting at 0x234ec30
~Int...

Вы видите, что объект, созданный в определенном месте, также удаляется.
См. DEMO

0 голосов
/ 29 января 2019

Нет.unique_ptr теперь владеет и освобождается, когда выходит за рамки.

...