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

3

我使用new运算符分配了一个指针,并将内存的所有权分配给了一个新的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;
}

5
不行。正如你所说,所有权已经转移到了“unique_ptr”。 - songyuanyao
指向的对象是所拥有的资源。如果您释放它,就不再有任何可拥有的东西了。 - StoryTeller - Unslander Monica
3个回答

5

现在,unique_ptr 拥有所有权,并且当其超出作用域时将被释放。


2
当你的代码执行到return时,你有三个指针(a, auptrb)指向同一个由new分配的对象。在return之后,auptr将超出作用域并释放对象,因此你不必手动释放它,也没有内存泄漏。
请注意,你的代码看起来是误用了unique_ptr。你最初使用原始指针,并从中间智能指针获取另一个原始指针。考虑使用std::make_unique并摆脱原始指针。

1
所有权已转移到unique_ptrauptr,回收现在是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...

你可以看到在特定位置创建的对象也被删除了。
请查看演示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接