[英]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
,你有三个指针( a
, auptr
和b
)指向同一个对象,由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.