当前位置: 代码迷 >> 综合 >> 智能指针(详解)——unique_ptr
  详细解决方案

智能指针(详解)——unique_ptr

热度:27   发布时间:2024-02-10 16:14:40.0

unique_ptr也有于shared_ptr相同的用法:
p、*p、p->get()、swap(),详情参见shared_ptr

1.特性

  • 某一时刻,只能有一个unique_ptr指向一个给定的对象
  • 当unique_ptr被销毁,,它所指向的对象也被销毁
  • 不能用make_shared,而是要将其绑定在一个new返回的指针上。
unique_ptr<int> p2(new int(42));	
  • 不支持普通的拷贝和赋值

错误示范:

int main()
{unique_ptr<string> p1(new string("asdfg"));unique_ptr<string> p2(p1);unique_ptr<string> p3;p3 = p2;return 0;
}

2.reset()和release()

  • reset();放弃对象并释放
  • reset(q);指向q
  • u.release();释放对象,返回指针,并将u滞空

代码演示:

int main()
{//realease正确用法unique_ptr<string> p1(new string("asdfg"));unique_ptr<string> p2(p1.release());cout << *p2 << endl;//realease错误示范,p2不会释放内存,并丢失指针unique_ptr<string> p3(new string("123456"));p3.release();//reset正确示范p2.reset();unique_ptr<string> p4(new string("123456"));p2.reset(p4.release());//实现拷贝return 0;
}

3.特殊的拷贝和赋值

即将销毁的unique_ptr可以使用普通的拷贝赋值

unique_ptr<string> fun1(string p)
{return unique_ptr<string>(new string(p));
}unique_ptr<string> fun2(string p)
{unique_ptr<string> ret(new string(p));return ret;
}int main()
{//realease正确用法unique_ptr<string> p1(fun1("I Love You!"));unique_ptr<string> p2(fun2("MeeTo!"));cout << "你:" + *p1 << endl;cout << "你的女神:" + *p2 << endl;return 0;
}

3.向unique_ptr传递删除器

(没太理解,所以直接贴原书内容,日后补全)
在这里插入图片描述