C++11定义在<memory>头文件的新特性:unique_ptr、shared_ptr和weak_ptr等智能指针
作用:对动态资源进行管理,保证在任何情况下,已构造的对象最终会销毁,即最终都会自动调用析构函数。
1. unique_ptr
1.1 创建智能指针对象
unique_ptr<int> p(new int(10))
p当作指向 10 的指针用,可以用*p 访问10,实际上unique_ptr类里面重载了*运算符,unique_ptr里面有一个成员指针函数指向10。
有3种方式创建智能指针对象( 有参构造,拷贝构造,移动构造 )
建议参考:
1.2 释放unique_ptr指针对象
1.2.1 出了作用域自动释放
1.2.2 使用赋值nullptr 或者 NULL可以人为释放
1.2.3 使用reset函数可以人为释放
1.3 注意事项
禁用拷贝构造
unique_ptr<int> p1(new int(10));
unique_ptr<int> p2 = p1;
取而代之可以使用“移动构造”,把p1的使用权,转交给p2,p1则不能再操作堆区空间了。
unique_ptr<int> p1(new int(10));
unique_ptr<int> p2 = std::move(p1);
可以使用reset绑定新内存
unique_ptr<int> p1(new int(10));
p1.reset(new int(20));
释放unique_ptr的控制权,但是不释放堆区内存,*p返回10
unique_ptr<int> p1(new int(10));
int *p = p1.realease();
2.shared_ptr
允许多个智能指针共享同一堆分配对象的内存,通过引用计数实现,会记录有多少个shared_ptr共同指向同一个对象。一旦最后一个指针被销毁,那么引用计数会变为0,这个对象就被自动删除。
2.1 注意事项
允许拷贝构造
shared_ptr<int> p1(new int(10));
shared_ptr<int> p1 = p2;
通过use_count查看计数器次数
3. 还有boost::shared_ptr和std::shared_ptr
已经解决:类内静态成员,类外声明
网上目前说的是用法一致。。。
不太懂下面的操作:
namespace camodocal
{
class CameraFactory
{
static boost::shared_ptr<CameraFactory> m_instance;
}
}
namespace camodocal
{
boost::shared_ptr<CameraFactory> CameraFactory::m_instance;
}
3.1 get()函数
判断shared_ptr是否指向对象
3.2 reset()
括号有参数,会释放shared_ptf原有对象,再让其指向括号内的参数
括号无参数,则会释放原有的shared_ptr对象,释放后指向get()函数返回false
c++ shared_ptr的reset(), get()_YZF_Kevin的博客-CSDN博客_c++ reset()