我为指针分配了新的运算符,并将内存的所有权分配给了新的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;
}
答案 0 :(得分:5)
不。 unique_ptr
现在拥有所有权,并在超出范围时被释放。
答案 1 :(得分:2)
当代码到达return
时,您有三个指针(a
,auptr
和b
)指向由{{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