#include <iostream>
#include <memory>
class T
{
public:
T() : t(5)
{
}
~T()
{
std::cout << "destructor" << std::endl;
std::cout << "t value" << t << std::endl;
}
T(T&& t1)
{
//this->t = t.t+5;
std::cout << "move constructor..." << std::endl;
std::cout << "t value" << t << std::endl;
}
public:
int t;
};
int main()
{
std::unique_ptr<T> p = std::make_unique<T>();
std::cout << p->t << std::endl;
//std::unique_ptr<T> p1(p); //报错,unique特性,该构造被移除
T* t = new T();
T* t2 = new T();
t2->t = 10;
std::unique_ptr<T> p1(std::move(p));
if (p)
{
std::cout << "p not null" << std::endl;
}
else
{
std::cout << "p is null" << std::endl;
}
std::unique_ptr<T> p2(t);
T *t1 = p2.release(); //该指针放弃操作对空间的权限,不对堆空间进行释放操作
if (t)
{
std::cout << "t not null" << std::endl;
}
else
{
std::cout << "t is null" << std::endl;
}
//此处要自己释放申请的t
std::cout << t1->t << std::endl;
delete t1; //delete t; t = nullptr;
t1 = nullptr;
std::cout << t->t << std::endl;
if (t) //凭借指针的地址有无并无法判断是否为空悬指针,依旧会输出,但其实t已经被释放
{
std::cout << "t not null" << std::endl;
}
else
{
std::cout << "t is null" << std::endl;
}
p2.reset(t2); //释放当前指向对空间的所有权,指向新的(参数)堆空间
T* t3 = p2.get(); //仅是返回一下指针,实际还操控着该堆空间
//delete t3;
if (!p2)
{
std::cout << "p2 id null" << std::endl;
}
//std::cout << p2->t << std::endl;
return 0;
}
unique_ptr的简单使用
最新推荐文章于 2023-03-26 19:44:41 发布