繁体   English   中英

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

[英]Transferring ownership of raw pointer to unique_ptr

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

不, unique_ptr现在拥有所有权,当它超出范围时会被取消分配。

当你的代码到达return ,你有三个指针( aauptrb )指向同一个对象,由new分配。 返回后, auptr将超出范围,它的析构函数将释放该对象,因此您不必手动执行此操作并且没有内存泄漏。

请注意,您的代码看起来是对unique_ptr误用。 您最初创建一个原始指针,并从中间智能指针获取另一个原始指针。 考虑使用std::make_unique并删除原始指针。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM