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++内存管理机制是当一个变量或对象从作用域过期的时候就会从内存中将他干掉.但是如果变量只是一个指针 ...
随机推荐
- ASP.NET进行请求转发
前言 前两天将网站的部分功能在小程序上实现,网站的后台是http,没有配置域名和安全证书,小程序的线上版本是无法访问的,因此需要从配有域名和安全证书的站点进行转发.即小程序请求A,A转发请求到B,B获 ...
- Java 面向对象(四)
代码块 什么是代码块 在类中或方法当中 使用 { } 括起来的一段代码,就称它是一个代码块. 在代码块当中定义的变量我们称是局部变量,在外面是没有办法使用的.这里定义的 a 就是一个局部变量. 代码块 ...
- IntelliJ IDEA中构建spring-boot项目
1. 打开 IDEA ,新建项目 2. 选择Spring Initializr 并在 Choose Initializr Service URL 填入 https://start.spring.io ...
- 双缓冲技术局部更新原理之派生自View
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...
- 002-创建型-05-原型模式(Protype)
一.概述 指原型实例指定创建对象的种类,并通过克隆这些原型创建新的对象 原型模式就是让类实现Cloneable接口,达到克隆原型类的方式. 1.1.适用场景 1.在创建对象的时候,我们不只是希望被创建 ...
- spring boot配置文件、日志配置和代码的多环境配置
一般项目都逃不掉开发.测试和生产这三套环境,如果每次给这三套环境打包都去改配置,累死不说,还一不留心就出差错.倒不如每套环境各给一套配置来的轻松.上代码: 1.通用配置放在application.pr ...
- java设置北京时间的时区
java设置北京时间的时区 解决方法: 设置北京时间的时区,消除时间差. TimeZone timeZone = TimeZone.getTimeZone("GMT+8"); ...
- WebDriver介绍
Fetching a Page driver.get("http://www.google.com") Locating UI Elements (WebElements) By ...
- php-fpm优化参数介绍
1.php-fpm优化参数介绍他们分别是:pm.pm.max_children.pm.start_servers.pm.min_spare_servers.pm.max_spare_servers. ...
- 使用javamelody监控springboot项目
JavaMelody是用来在QA和实际运行生产环境中监控Java或Java EE应用程序服务器的一个开源框架.它不是一个工具来模拟来自用户的请求,而是一个测量和计算用户在实际操作中应用程序的使用情况的 ...