> 文章列表 > C++智能指针unique_ptr

C++智能指针unique_ptr

C++智能指针unique_ptr

智能指针的设计思路

智能指针是类模板,在栈上创建智能指针对象。把普通指针交给智能指针对象。当智能指针对象过期时,调用析构函数释放普通指针的内存。

有unique_ptr,shared_ptr和weak_ptg三种智能指针

unique_ptr

unique_ptr独享它指向的对象,同一时间只有一个unique_ptr指向同一个对象。当unique_ptr被销毁时,指向的对象有也随即被销毁。

#include<memory>

/*
T表示指针指向的数据类型;
第二个模板参数指定删除器,缺省用delete释放资源;
*/
template <typename T, typename D=default_delete<T>>
class unique_ptr
{
public:explicit unique_ptr(poniter p) noexcept;//不可用于转换函数unique_ptr(const unique_ptr&) = delete;//禁用拷贝构造函数T& operator*() const;                  //重载了*操作符T* operator->() const noexcept;			//重载了->运算符private:poniter p;
};

unique_ptr的更多技巧:

1.如果源unique_ptr是一个临时右值,允许赋值;

std::unique_ptr<A> func()
{std::unique_ptr<A> pp(new A("民权"));return pp;
}
//*如果unique_ptr是一个临时右值,允许使用=赋值*/
std::unique_ptr<A> ptr5 = std::unique_ptr<A>(new A(""));
std::unique_ptr<A> ptr5 = func();

2.用nullptr给unique_ptr赋值将释放对象

3.release()释放对指针的控制权,将unique_ptr置为空,返回裸指针。

4.std::move可以转移对指针的控制权

	
void fun1(const A* p)
{}
void fun2(A* p)
{}
void fun3(const std::unique_ptr<A>& a)
{}
void fun4(std::unique_ptr<A> a)
{}//四种使用场景//fun1()需要一个指针,但不对这个指针负责fun1(pPtr.get());//fun2需要一个指针,对这个指针负责fun2(pPtr.release());//fun3需要一个unque_ptr,不对这个unique_ptr负责fun3(pPtr);//fun4需要一个unqie_ptr,对这个unique_ptr负责fun4(std::move(pPtr));

5.reset释放对象

p.reset();//释放p指向的对象

p.reset(nullptr);//释放p指向的对象

p.reset(new A(""));//释放p指向的资源对象,同时指向新的对象

6.unique_ptr可以像普通指针那样,当指向一个类继承体系的基类对象时,也具有多态性质,如果使用裸指针基类对象和派生类对象那样

8.unique_ptr不是绝对安全,如果程序中调用了exit退出,全局的unique_ptr可以自动释放,但局部的unique_ptr无法释放

9.unique_ptr提供了供数组的具体化版本

	std::unique_ptr<int[]> parr(new int[3]{33,344,76});std::cout << parr[0] << std::endl;std::cout << parr[1] << std::endl;std::cout << parr[2] << std::endl;std::unique_ptr<A[]> parr1(new A[3]{ "","","" });std::cout << parr1[0].m_name << std::endl;std::cout << parr1[1].m_name << std::endl;std::cout << parr1[2].m_name << std::endl;