C++ 智能指针
好记性不如烂笔头,有人问我C++智能指针是什么?我不太确定的给他说是auto_ptr。auto_ptr那么到底对不对呢?是对的,但也不全。那么智能 指针有哪些呢?在C++ 中智能指针有std::auto_ptr、std::unique_ptr 、std::shared_ptr、std::weak_ptr。
在没有智能指针的时候,我们对堆内存的管理就是简单的new / delete。这样我们往往会遗忘使用delete 去释放资源。因此智能指针就给我们提供了方便。
基础类
class Monster{
public:
Monster(char *name):m_name(name)
{
cout<<m_name<<" Constructor..."<<endl;
}
~Monster()
{
cout<<m_name<<" DeConstructor..."<<endl;
}
void doSomething()
{
cout<<m_name<<" doSomething..."<<endl;
}
private:
char *m_name;
};
std::auto_ptr
在C++11 以前最原始的智能指针是std::auto_ptr
在C++11中std::auto_ptr被遗弃了,替代它的是std::unique_ptr、std::shared_ptr、std::weak_ptr。
std::unique_ptr 一种强引用 指针
在语法上比std::auto_ptr更加安全(尝试复制unique_ptr是会在编译器报错,而auto_ptr能通过编译期从而在)运行期埋下出错的隐患)
std::unique_ptr 正如其名唯一的,因此它不允许拷贝,但它的独占权可以被转移使用std::move(std::unique_ptr对象)方法。
void example_fun2()
{
std::unique_ptr<Monster> monster1(new Monster("monster1"));
//std::unique_ptr<Monster> monster2 = monster1; // 报错unique_ptr声明的强引用不允许被复制
std::unique_ptr<Monster> monster3 = std::move(monster1); //强引用指针所有权可以被转移使用std::move(std::unique_ptr)
//monster1->doSomething(); //当unique_ptr强引用控制权被转移后,就不能再使用对象中的资源,在编译时不会报错,但在运行时候会出错
monster3->doSomething();
}
std::shared_ptr 一种强引用指针
多个shared_ptr指向 同一处资源,当所有shared_ptr都全部释放时, 该处资源才释放。
(有某个对象的所有权(访问权、生命控制权))即是强引用、所以shared_ptr是一种强引用型指针)
void example_fun3()
{
std::shared_ptr<Monster> monster1(new Monster("monster1"));
do{
std::shared_ptr<Monster> monster2 = monster1;
}
while(0);
//monster1->doSomething();
std::shared_ptr<Monster> monster3 = monster1;//多次复制强引用
monster1->doSomething();
}
std::weak_ptr 一种弱引用指针
std::weak_ptr 是为了辅助std::shared_ptr的存在,它只提供了对管理毒性的访问手段,同时可以实时动态的知道指向的对象是否 存活。
只有某个对象的访问权,而没有它的生命控制权,即是弱引用。
void example_fun4()
{
std::shared_ptr<Monster> monster1(new Monster("monster1"));
std::weak_ptr<Monster> monster2 = monster1;
//monster2->doSomething(); //Error!编译出错!weak_ptr没有重载*和->,无法直接当指针使用
std::shared_ptr<Monster> monster3 = monster2.lock(); // 可以通过weak_ptr的lock方法获得shared_ptr.
monster3->doSomething();
}