C++新特性---智能指针
// 使用RAII思想设计的SmartPtr类
template<class T>
class SmartPtr {
public:
SmartPtr(T* ptr = nullptr)
: _ptr(ptr)
{} ~SmartPtr() {
if(_ptr)
delete _ptr;
}
private:
T* _ptr;
}; void MergeSort(int* a, int n) {
int* tmp = (int*)malloc(sizeof(int)*n);
// 讲tmp指针委托给了sp对象,用时老师的话说给tmp指针找了一个可怕的女朋友!天天管着你,直到你go die^^
SmartPtr<int> sp(tmp);
// _MergeSort(a, 0, n - 1, tmp);
// 这里假设处理了一些其他逻辑
vector<int> v(, );
// ...
} int main() {
try {
int a[] = { , , , , };
MergeSort(a, );
}
catch(const exception& e) {
cout<<e.what()<<endl;
}
return ;
}
template<class T>
class SmartPtr {
public:
SmartPtr(T* ptr = nullptr)
: _ptr(ptr)
{}
~SmartPtr() {
if(_ptr)
delete _ptr;
}
T& operator*() {return *_ptr;}
T* operator->() {return _ptr;}
private
T* _ptr;
};
struct Date {
int _year;
int _month;
int _day;
};
int main() {
SmartPtr<int> sp1(new int);
*sp1 =
cout<<*sp1<<endl; SmartPtr<int> sparray(new Date);
// 需要注意的是这里应该是sparray.operator->()->_year = 2018;
// 本来应该是sparray->->_year这里语法上为了可读性,省略了一个->
sparray->_year = ;
sparray->_month = ;
sparray->_day = ;
}
- C++98中产生了第一个智能指针auto_ptr
- C++boost给出了更实用的scoped_ptr和shared_ptr和weak_ptr
- C++11,引入了unique_ptr和share_ptr和weak_ptr.需要注意的是unique_ptr对应boost的scoped_ptr.并且这些智能指针是实现原理是参考boost中的实现的
auto_ptr {
构造->保存指针信息
析构->释放指针空间
auto_ptr<int> ptr(ptr2);
拷贝构造->(转移管理权的形式,将ptr2赋值给_ptr,置空ptr2)
auto_ptr<int> ptr = ptr2;
赋值运算符重载->(转移管理权,判断是否自己给自己赋值,先释放自己所指向的空间,在用ptr2赋值给_ptr,置空ptr2)
}
unique_ptr {
//线程安全
//不支持拷贝构造
C++:
unique_ptr(const unique+ptr<T>& ap) = delete;
unique_ptr<T>& opreator=(const unique_ptr<T>& ap) = delete;
C++:
//只声明,不实现,声明成私有
}
shared_ptr {
//会存在引用计数的线程安全问题
//实现了引用计数的方式
////////////////////////////////////////////////////////////////////////////////////
//此方法存在一定问题
private:
T* _ptr
statice int _count;
//使用statice会存在一定问题:
//使用了statice后每个对象只会公用一块空间,而当需要多块空间来计数的时候就不能实现
//sp1; sp2(sp1)-> 1和2公用一个空间 sp3; sp4(sp3);->3和4公用一块空间
//这样就需要两个引用计数,但是statice后一个类只能存在一个引用计数
////////////////////////////////////////////////////////////////////////////////////
public:
shared_ptr(T* ptr)
:_ptr(ptr)
,_pcount(new int())
{}
shared_ptr(const shared_ptr<T>& sp)
:_ptr(sp._ptr)
,_pcount(sp._pcount)
{
(*_pcount)++;
}
shared_ptr<T>& operator=(const shared_ptr<T>& sp)
{
if(this != &sp)
{
//ptr1; ptr2(ptr1)
//ptr3; ptr3 = ptr2;
//先判断ptr2的计数是否为0,不为0则不能释放,说明其他指针还在使用
if(--(*_pcount) == )
{
delete _pcount;
delete _ptr;
}
_ptr = sp._ptr;
_pcount = sp._pcount;
(*_pcount)++;
}
return *this;
}
~shared_ptr()
{
if(--(*_pcount) == )
{
delete _ptr;
delete _pcount;
_pcount = nullptr;
_ptr = nullptr;
}
}
private:
T* _ptr;
int* _pcount;
//_pcount 在堆上,会存在线程安全问题
}
//shared_ptr 修改确保shared_ptr的线程安全问题
shared_ptr {
public:
shared_ptr(T* ptr)
:_ptr(ptr)
,_pcount(new int())
{}
shared_ptr(const shared_ptr<T>& sp)
:_ptr(sp._ptr)
,_pcount(sp._pcount)
{
(*_pcount)++;
}
shared_ptr<T>& operator=(const shared_ptr<T>& sp)
{
if(this != &sp)
{
//ptr1; ptr2(ptr1)
//ptr3; ptr3 = ptr2;
//先判断ptr2的计数是否为0,不为0则不能释放,说明其他指针还是只用
if(--(*_pcount) == )
{
delete _pcount;
delete _ptr;
}
_ptr = sp._ptr;
_pcount = sp._pcount;
(*_pcount)++;
}
return *this;
}
~shared_ptr()
{
if(--(*_pcount) == )
{
delete _ptr;
delete _pcount;
_pcount = nullptr;
_ptr = nullptr;
}
}
private:
T* _ptr;
int* _pcount;
//_pcount 在堆上,会存在线程安全问题
}
struct Date{
int _year;
int _month;
int _day;
};
struct ListNode{
//ListNode* _next;
//ListNode* _prev;
/*
std::shared_ptr<ListNode> _next;
std::shared_ptr<ListNode> _prev;
*/
std::weak_ptr<ListNode> _next;
std::weak_ptr<ListNode> _prev;
~ListNode()
{
cout << "~ListNode()" << endl;
}
};
int main()
{
std::shared_ptr<ListNode> node1(new ListNode);
std::shared_ptr<ListNode> node2(new ListNode);
cout << node1.use_count() << endl;
cout << node2.use_count() << endl;
node1->_next = node2;
node2->_prev = node1;
cout << node1.use_count() << endl;
cout << node2.use_count() << endl;
return ;
}
C++新特性---智能指针的更多相关文章
- [C++11新特性] 智能指针详解
动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极为困难的.有时我们会忘记释放内存产生内存泄漏,有时提前释放了内存,再使用指针去引用内存就会报错. 为了更容易(同时也更安全)地使用动态内存, ...
- c++11新特性实战(二):智能指针
c++11添加了新的智能指针,unique_ptr.shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated). 但是在实际的使用过程中,很多人都会有这样的问题: ...
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
1 . 通用函数可变参数模板 对于有些时候,我们无法确切的知道,函数的参数个数时,而又不想过多的使用所谓的函数重载,那么就可以效仿下面的例子: #include<iostream> #i ...
- [转]C++智能指针的创建
zero 坐在餐桌前,机械的重复“夹菜 -> 咀嚼 -> 吞咽”的动作序列,脸上用无形的大字写着:我心不在焉.在他的对面坐着 Solmyr ,慢条斯理的吃着他那份午餐,维持着他一贯很有修养 ...
- c++ 智能指针【转载】
zero 坐在餐桌前,机械的重复“夹菜 -> 咀嚼 -> 吞咽”的动作序列,脸上用无形的大字写着:我心不在焉.在他的对面坐着 Solmyr ,慢条斯理的吃着他那份午餐,维持着他一贯很有修养 ...
- 智能指针--C++
智能指针(一):STL auto_ptr实现原理 智能指针实际上是一个类(class),里面封装了一个指针.它的用处是啥呢? 指针与内存 说到指针自然涉及到内存.我们如果是在堆栈(stack)中分配了 ...
- 转:c++ 11 新特性
声 明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的<The Biggest Changes in C++11(and Why You Should Care)&g ...
- C++ | 智能指针初探
智能指针初探 在 c/c++ 语言中有一种特殊的类型--指针类型. 指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量.它可以直接对内存地址中的数据进行操作,是一种非常灵活的变量.指针被誉为 ...
- C++11 智能指针
C++ 11标准库引入了几种智能指针 unique_ptr shared_ptr weak_ptr C++内存管理机制是当一个变量或对象从作用域过期的时候就会从内存中将他干掉.但是如果变量只是一个指针 ...
随机推荐
- thymeleaf 声明
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd&qu ...
- CentOS 7 安装MySQL8
安装 下载Linux对应的MySQL https://dev.mysql.com/downloads/mysql/ CentOS选择Red Hat Enterprise Linux 在/usr/loc ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- linux内核中的regmap是如何初始化的?
1. 内核版本 5.2.0 2. 请看devm_regmap_init_i2c (include/linux/regmap.h) /** * devm_regmap_init_i2c() - Init ...
- 简易的CRM系统案例之Servlet+Jsp+MySQL版本
数据库配置 datebase.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/infos usernam ...
- python常见面试集合
Python面试题目一.Python1. python的多进程与多线程的运行机制是什么?有什么区别?分别在什么情况下用?2. Python的装饰器的原理是什么,在什么情况会用到装饰器.请手写Pytho ...
- Elasticsearch 7.x文档基本操作(CRUD)
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html 1.添加文档 1.1.指定文档ID PUT ...
- 123457123457#0#-----com.threeapp.renzhepaoku01----儿童跑酷游戏(忍者版)
com.threeapp.renzhepaoku01----儿童跑酷游戏(忍者版)
- Casbin 使用记录
Casbin 是什么? 官方解释:Casbin是一个强大的.高效的开源访问控制框架,其权限管理机制支持多种访问控制模型. Casbin只负责访问控制.身份认证 authentication(即验证用户 ...
- ubuntu18.04 server配置静态ip,新的网络工具netplan的使用方法【转:http://forum.ubuntu.org.cn/viewtopic.php?t=487463】
最新发布的ubuntu18.04 server,启用了新的网络工具netplan,对于命令行配置网络参数跟之前的版本有比较大的差别,现在介绍如下:1.其网络配置文件是放在/etc/netplan/50 ...