unique_ptr, shared_prt,weak_ptr,make_shared 简单描述及对比
#include <iostream>
#include <string>
#include <vector>
#include <memory>
class test{
public:
test(){std::cout<<"test constructor..."<<std::endl;}
std::string name="test";
~test() { std::cout << "test destructor..." << std::endl; }
};
/*unique_ptr是C++11提供的用于防止内存泄漏的智能指针中的一种实现,
unique_ptr包装一个原始指针,并负责其全部生部周期,独占所指的内存
独占:不能被拷贝及赋值. 但是可以被移动
*/
void test_unique_ptr()
{
/*创建实例*/
std::unique_ptr<test> pt(new test());
/*通过unique_ptr 访问成员*/
std::cout<<"name:"<<pt->name<<std::endl;
/*赋值, 出错*/
//std::unique_ptr<test> pt1 = pt;
/*move, 正常*/
std::unique_ptr<test> pt1 = std::move(pt);
std::cout<<"name:"<<pt1->name<<std::endl;
/*pt 变为空指针*/
pt1.reset(); /*释放内存*/
//pt1.reset(new test()); /*释放内存,并绑定新的动态对象*/
}
/*
防止内存泄漏,确保用new动态分配的内存空间在各执行路径被释放,
允许多个shared_ptr对象共同托管一个对象,通过引用计数管理对象,当
对象计数变为0时,自动删除,支持复制与拷贝
*/
void test_shared_ptr()
{
/*创建,复制操作,及引用计数的变化*/
std::shared_ptr<test> pt(new test());
std::cout<<"pt ues count:"<<pt.use_count()<<std::endl;
std::shared_ptr<test> pt1 = pt;
std::cout << "pt ues count:" << pt.use_count() << std::endl;
std::cout << "pt1 ues count:" << pt1.use_count() << std::endl;
std::cout<<"pt name:"<<pt->name<<std::endl;
std::cout<<"pt1 name:"<<pt1->name<<std::endl;
/*reset, 引用计数变化*/
pt.reset();
std::cout << "pt ues count:" << pt.use_count() << std::endl;
std::cout << "pt1 ues count:" << pt1.use_count() << std::endl;
/*move, 引用计数变化*/
std::shared_ptr<test> pt2 = std::move(pt1);
std::cout << "pt1 ues count:" << pt1.use_count() << std::endl;
std::cout << "pt2 ues count:" << pt2.use_count() << std::endl;
}
/*weak_ptr的引入,是为了解决share_ptr 循环引用问题,
weak_ptr也是一模块类,但是不能直接用它来定义一个智能指针对象,
只能配合share_ptr来使用,将share_ptr赋值给weak_ptr,且这样不
会改变引用计数的值
成员函数:
lock: 获取shared_ptr 对象,引用加1
expired: 检测是否可用
*/
void check_weak_ptr(std::weak_ptr<test> &p)
{
/*弱引用,有则引用,无则返回null*/
std::shared_ptr<test> pp = p.lock();
if(pp == nullptr)
{
std::cout<<"invalid."<<std::endl;
}else{
std::cout<<"use count:"<<pp.use_count()<<std::endl;
}
}
void test_weak_ptr()
{
/*查看引用计数变化*/
std::shared_ptr<test> pt(new test());
std::cout<<"pt count:"<<pt.use_count()<<std::endl;
std::weak_ptr<test> pt1 = pt;
std::cout<<"pt count:"<<pt.use_count()<<std::endl;
check_weak_ptr(pt1);
}
/*make_shared: 比较安全的分配函数,一次性分配share_ptr与实例对象的内存
效率较高
*/
void test_make_shared()
{
std::shared_ptr<test> p = std::make_shared<test>();
auto p1 = std::make_shared<test>();
}
int main()
{
test_unique_ptr();
test_shared_ptr();
test_weak_ptr();
test_make_shared();
}