博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++智能指针(三)总结
阅读量:4096 次
发布时间:2019-05-25

本文共 2802 字,大约阅读时间需要 9 分钟。

https://blog.csdn.net/nou_camp/article/details/70195795

在上一篇博客中(C++智能指针(二))模拟实现了三种智能指针。 

其中最好的就是shared_ptr,但是这并不代表它就是最完美的,它也有问题,这个问题就是循环引用问题。下面用一段代码来解释说明循环引用问题。
#include
struct ListNode{ shared_ptr
_next; shared_ptr
_prev; int _data; ListNode(int x) :_data(x) , _next(NULL) , _prev(NULL) {} ~ListNode() { cout << "~ListNode()" << endl; }};void test(){ shared_ptr
ap1(new ListNode(10)); shared_ptr
ap2(new ListNode(20)); ap1->_next = ap2; ap2->_prev = ap1;}int main(){ test(); system("pause"); return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

这里写图片描述

这就是shared_ptr的缺陷–循环引用问题 

这里写图片描述

为了解决循环引用的问题,引进了弱指针weak_ptr 

weak_ ptr是一种不控制所指向对象的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr 不会改变shared_ptr的引用计数 
测试代码如下

#include
using namespace std;#include
struct ListNode{ weak_ptr
_next; weak_ptr
_prev; int _data; ListNode(int x) :_data(x) {} ~ListNode() { cout << "~ListNode()" << endl; }};void test(){ shared_ptr
ap1(new ListNode(10)); shared_ptr
ap2(new ListNode(20)); ap1->_next = ap2; ap2->_prev = ap1;}int main(){ test(); system("pause"); return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

仿函数:仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

template
struct Less{ bool operator()(const T& l, const T& r) { return l < r; }};void Test2(){ Less
less1; cout << less1(1, 2) << endl;}int main(){ Test2(); system("pause"); return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

定制删除器和空间分配器

#define _CRT_SECURE_NO_WARNINGS#include
using namespace std;#include
class FClose{public: void operator()(void* ptr) { cout << "fclose" << endl; fclose((FILE*)ptr); }};class Free{public: void operator()(void* ptr) { cout << "free" << endl; free(ptr); }};void test() { //定制删除器 shared_ptr
p1(fopen("test.txt", "w"), FClose()); //定制删除器和分配器 shared_ptr
p2((int*)malloc(sizeof(int)), Free(), allocator
());}int main(){ test(); system("pause"); return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

智能指针总结 

智能指针可以提供对动态分配的内存安全而方便的管理,但这建立在正确的使用前提下。 
1.不使用相同的内置指针值初始化(或reset)多个智能指针。 
2.不delete get( )返回的指针。(p.get( )返回p中保存的指针。要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了) 
3.不使用get()初始化或reset另一个智能指针。 
4.如果使用get( )返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变成无效了。 
5.使用智能指针管理的资源不是new分配的内存,记住传递给他一个定制的删除器。  

你可能感兴趣的文章
JAVA--定义一个包含整型数组参数的方法,用来接收成绩数组,进行成绩排序并输出前三名
查看>>
已选择过的酒品品种,第二次选择时,会提示选择重复
查看>>
angularjs上传多张图片并预览
查看>>
angularjs上传图片时预览-点击图片放大
查看>>
已选择过的酒品品种,第二次选择时,会提示选择重复---改进
查看>>
angularjs三级省市联动
查看>>
angularjs分页查询
查看>>
input type="number"数字过大时
查看>>
angularjs中的$watch
查看>>
点击旋转图片90度-jquery
查看>>
angualrjs--resolve使用
查看>>
AngularJS 无限滚动加载数据控件 ngInfiniteScroll
查看>>
用jsp实现登录,登录成功则跳转到登录成功页面,失败则跳转到失败页面
查看>>
jsp-session
查看>>
jsp--javabeans
查看>>
上传图片时预览获取图片原始的宽度和size大小
查看>>
web.xml文件的作用及基本配置
查看>>
HTML5头部信息解释
查看>>
angularjs默认选中--包括省市联动的默认选中
查看>>
加载页面时同时触发两个ajax请求,数据显示的顺序不一致
查看>>