将原始指针的所有权转移到unique_ptr

时间:2019-01-29 05:24:01

标签: c++ memory-leaks

我为指针分配了新的运算符,并将内存的所有权分配给了新的unique_ptr。我是否必须删除使用new分配的指针?这里有内存泄漏吗?

#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 :(得分:5)

不。 unique_ptr现在拥有所有权,并在超出范围时被释放。

答案 1 :(得分:2)

当代码到达return时,您有三个指针(aauptrb)指向由{{1}分配的同一对象}。返回后,new将超出范围,并且它的析构函数将取消分配对象,因此您不必手动进行操作,也不会发生内存泄漏。

请注意,您的代码看起来像是误用auptr。您首先创建一个原始指针,然后从中间智能指针中获取另一个原始指针。考虑使用std::make_unique并摆脱原始指针。

答案 2 :(得分:1)

所有权已转移到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