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;