智能指针使用Tip

原创 2018年04月15日 13:47:17

C++11引入shared_ptr,unique_ptr,weak_ptr后,大大简化了c++对动态内存的管理,为了能更好的发挥智能指针的优势,且避免不必要的异常,下面总结了使用智能指针的的一些注意事项:


1.智能指针是行为像指针的类,其本质是一个类,其原理是通过构造/拷贝/赋值/析构操作来维护引用计数,从而达到对资源的管理,且该资源不仅仅限于动态内存
比如:可以通过智能指针管理tcp的连接与端口;

{
	int handle = tcp_nenect(ip_addr, port_num); 
	shared_ptr<int> p((int*)handle, [](int* h) {tcp_disconnect((int)h);}; //
	
	//离开作用域时,自动断开连接
	....
}
2.尽量不用get()函数返回智能指针保存的指针,而是直接采用解引用运算符(*/);为了解决这个问题,是需要知道我们在什么情况下使用get(),及其对应的替换方式
情形一:智能指针类型为动态数组,通过get()返回头指针进行指针运算.(智能指针不支持),
此种情形最好将内置数组换成vector或array容器;
unique_ptr<int[]> parray(new int[10]);
int *begin = parray.get();		//通过get()返回头指针
int *end = begin + 10;

fill(begin, end, 10);
for_each(begin, end, [](const int& p) {
	cout<< p << " ";
}); //打印 10 10 10 ...10 
cout<<endl;	

//采用解引用 
for(int i = 0;i < 10; i++)
	parray[i] = 12;

for(int i = 0;i < 10; i++)
	cout<< parray[i] << " ";
情形二:通过指针访问指向对象的成员
shared_ptr<pair<string, int>> ps = make_shared<pair<string, int>>(string("hello"), 10);
auto* pp = ps.get();	//多此一举,不提倡的用法 
cout<< pp->first << " " << pp->second << endl;
	
cout<< ps->first << " "	<< ps->second << endl; //简单方便 
3.当需要管理多个相同元素时不要用内置数组建议使用vector或array容器之所以不使用内置数组,是由于shared_ptr<>不直接支持动态数组管理,且无法高效使用标准库
//shared_ptr类型为内置数组必须声明删除器为delete[]
shared_ptr<int> sp(new int[10], [](int*p) { delete[] p; } );

//建议方法
shared_ptr<vector<int>> sp = make_shared<vector<int>>(10, 1);
for_each(sp->begin(), sp->end(), [](int &e) {cout<< e << " "; } );
4.尽量不能混用普通指针和智能指针,尤其是以下几点:
  ①不使用相同的内置指针初始化(或reset)多个智能指针,正确方式如下:
   shared_ptr<int> p(new int(10)); //ok,但提倡使用make_pair
   p.reset(new int(42));		   //ok
  ②不delete get()返回的指针
  ③不使用get()初始化或reset另一个智能指针
  ④如果使用get()返回的指针,当对应的最后一个智能指针销毁后,此指针就无效了

反正上面四点记也挺麻烦,easy一点,就是别混用两者,甚至只使用智能指针;

5.使用make_pair初始化智能指针更简单,更安全
shared_ptr<vector<int>> sp = make_shared<vector<int>>(10, 1); //运用的v(n, )构造

shared_ptr<pair<string, int>> ps = make_shared<pair<string, int>>(string("hello"), 10);

shared_ptr<vector<int>> sp = make_shared<vector<int>>(vector<int>{1,2,3,4,5}); //不能少vector<int>
6.采用typedef关键字定义智能指针类型避免表达式过长
//改写上面的表达式
typedef vector<int> vint ;
typedef shared_ptr<vector<int>> vi_sptr ;

vi_sptr sp1 = make_shared<vint>(10, 1);
vi_sptr sp2 = make_share<vint>(vint{1,2,3,4,5});
7.使用weak_ptr前请先lock()
//正确使用方式
if(share_ptr<int> np = wp.lock()) //如果np不为空则条件成立
{
	//正常使用np进行操作
}





精通C语言指针

指针被誉为C语言的精髓、C本质上是加了一层语法糖的汇编,引进当时先进的函数,保留了汇编强大的地址直接访问功能 —— 指针,使其高效灵活。本课程是黄强老师对于指针的一次专题讲解,相信能给大家带来收获!
  • 2017年09月06日 19:22

【C++】Vs2008中使用智能指针

Tr1模块是C++11正式诞生前夕,已经确定加入新标准的C++特性。Vs2008算是C++11标准正式诞生前夕,对C++03和tr1标准支持的最好的一个IDE,是相当经典的一版,很多程序的开发和维护都...
  • lpsl1882
  • lpsl1882
  • 2016-04-15 16:07:16
  • 1422

使用智能指针的注意事项

1. 使用unique_ptr以替代auto_ptrauto_ptr是C++98标准库提供的一个智能指针,但已被C++11明确声明不再支持。auto_ptr具有以下缺陷: * auto_ptr有拷贝...
  • u011475134
  • u011475134
  • 2017-08-06 18:11:38
  • 523

大型项目开发:谨慎使用智能指针

智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点: 1.性能问题。因为需要引入一些变量(bookkeeping)...
  • HorkyChen
  • HorkyChen
  • 2015-07-13 00:30:37
  • 3819

Qt 中的智能指针

Qt 中的智能指针上一篇博客中介绍了 C++11 标准中的提供的智能指针。在 Qt 中也提供了类似的替代功能,并且比 C++11 标准中提供的功能还要强大,所以如果我们使用 Qt 作为基础库,那么就没...
  • liyuanbhu
  • liyuanbhu
  • 2017-09-03 21:19:17
  • 1469

四种智能指针的用法和原理

智能指针共分为4种,即boost库中的auto_ptr、scoped_ptr、shared_ptr、weak_ptr。   智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时...
  • sinat_36118270
  • sinat_36118270
  • 2017-04-04 13:06:28
  • 3126

C++为什么要用智能指针

首先要理解什么是智能指针。  先来看普通指针,int *p = new int; 这个p 是一个普通指针,指向一个内存块,内存块中存放一个整形数值。 而智能指针是在普通指针的基础上,加上一个引用计...
  • snail_hunan
  • snail_hunan
  • 2015-01-24 16:22:41
  • 1055

c++智能指针(三)之shared_ptr和new结合使用

shared_ptr和new结合使用我们除了使用make_shared来初始化一个智能指针,还可以使用new返回的指针来初始化智能指针。shared_ptr p1(new int(42));//p1指...
  • u011337574
  • u011337574
  • 2017-12-24 19:54:06
  • 97

使用 C++11 智能指针时要避开的 10 大错误

http://blog.jobbole.com/104666/ 我很喜欢新的C++11的智能指针。在很多时候,对很多讨厌自己管理内存的人来说是天赐的礼物。在我看来,C++11的智能指针能使得C+...
  • liufengl138
  • liufengl138
  • 2017-01-31 20:51:13
  • 394

android 的 sp 智能指针用法介绍 sp<> wp<>

ref:
  • yellow_hill
  • yellow_hill
  • 2014-09-15 13:40:26
  • 1277
收藏助手
不良信息举报
您举报文章:智能指针使用Tip
举报原因:
原因补充:

(最多只允许输入30个字)