c/c++ 标准库 智能指针( smart pointer ) 是啥玩意儿
标准库 智能指针( smart pointer ) 是啥玩意儿
一,为什么有智能指针???
c++程序员需要自己善后自己动态开辟的内存,一旦忘了释放,内存就泄露。
智能指针可以帮助程序员"自动释放"自己开辟的内存。
二,从哪里看出来智能了???
int *p = new int(11);
auto_ptr<int> pa(p);//auto_ptr已经不推荐使用
//delete p;
上面的代码把p交给智能指针auto_ptr管理后,就不需要自己去delete p。auto_ptr会去释放p,所以体现出了"智能"。
三,哪里看起来像指针了???
int *p = new int(11);
my_auto_ptr<int> pa(p);
*pa = 111;
cout << *pa << endl;
cout << *p << endl;
上面的代码对智能指针pa使用了,*运算符,并且通过pa改变了p的值,所以看起来像指针哦。
class Test{
public:
void fun(){
cout << "func()" << endl;
}
};
Test* pt = new Test;
auto_ptr<Test> pa1(pt);
pa1->fun();
上面的代码对智能指针pa1使用了,->运算符,并且通过pa1调用了对象pt的fun()成员方法,所以看起来像指针哦。
四,智能指针到底是个啥玩意儿???
是个模板类。
五,智能指针的是怎么实现智能和指针的?
- 在智能指针的模板类里重写**operator* **运算符
- 在智能指针的模板类里重写operator->运算符
- 在智能指针的模板类的析构函数里,释放它指向的内存空间
- 管理指针的所有权和转移(下面的例子没有实现)
#include <iostream>
#include <memory>
using namespace std;
template<typename T>
class my_auto_ptr{
public:
my_auto_ptr(T* p = nullptr):own(p!=nullptr),ptr(p){}
~my_auto_ptr(){
if(own){
delete ptr;
}
}
T& operator*()const{
return *ptr;
}
T* operator->()const{
return ptr;
}
private:
bool own;
T* ptr;
};
class Test{
public:
void fun(){
cout << "func()" << endl;
}
};
int main(){
//test1 老版本的auto_ptr的使用,现在不推荐使用
/*
int *p = new int(10);
auto_ptr<int> pa(p);
cout << *pa << endl;
string* ps = new string("aaa");
auto_ptr<string> pas(ps);
cout << pas->size() << endl;
*/
//test2 自己实现auto_ptr
int *p = new int(11);
my_auto_ptr<int> pa(p);
//delete p;
*pa = 111;
cout << *pa << endl;
cout << *p << endl;
Test* pt = new Test;
my_auto_ptr<Test> pa1(pt);
pa1->fun();
return 0;
}
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ 标准库 智能指针( smart pointer ) 是啥玩意儿的更多相关文章
- C++ 标准库智能指针
整理一下c++中shared_ptr,weak_ptr,unique_ptr三种指针的使用案例和注意事项,让程序资源更加案例,在标准库中,需要包含<memory>,在boost库中, 一. ...
- (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现
转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...
- 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...
- C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
1.野指针的概念.成因以及避免 首先,来说说什么是野指针,所谓野指针就是一个指向未申请访问受限的内存区域或者已经删除了的对象的指针. 什么意思呢?就是本来一个指针指向一个对象.一块内存,但是由于程序( ...
- c++(smart pointer)
(一)首先对智能指针有一些概念性的了解 **********本部分内容摘自开源中国社区http://my.oschina.net/u/158589/blog/28994******** 1.什么是智能 ...
- C++智能指针shared_ptr
shared_ptr 这里有一个你在标准库中找不到的—引用数智能指针.大部分人都应当有过使用智能指针的经历,并且已经有很多关于引用数的文章.最重要的一个细节是引用数是如何被执行的—插入,意思是说你将引 ...
- c++ 智能指针(转)
智能指针的使用 智能指针是在 <memory> 标头文件中的 std 命名空间中定义的. 它们对 RAII 或“获取资源即初始化”编程惯用法至关重要. 此习惯用法的主要目的是确保资源获取与 ...
- 智能指针 auto_ptr、scoped_ptr、shared_ptr、weak_ptr
什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法. RAII又叫做资源分配即初始化,即:定义 ...
- 现代C++学习笔记之一入门篇:智能指针(C++ 11)
原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保 ...
随机推荐
- Chrome 浏览器最牛插件之一 Vimium
导航当页: ? 显示help,查询vimium的所有使用方法 h 向左滚动 j 向下滚动 k 向上滚动 l 向右滚动 gg 滚动到顶部 G 滚动到底部 d 向下滚动半页 u 向上滚动半页面 f 显示链 ...
- #21 Python异常
前言 运行程序时经常遇到各种错误,例如:ImportError(导入模块错误).IndexError(索引错误).NameError(变量错误).SyntaxError(语法错误).Indentati ...
- 教你如何在React及Redux项目中进行服务端渲染
服务端渲染(SSR: Server Side Rendering)在React项目中有着广泛的应用场景 基于React虚拟DOM的特性,在浏览器端和服务端我们可以实现同构(可以使用同一份代码来实现多端 ...
- 第12章 Linux配置定时任务详解
12.1 配置定时任务 首先需弄清的概念: (1).crond是一个daemon类程序,路径为/usr/sbin/crond.默认会以后台方式启动,service或systemd方式启动crond默认 ...
- ES5、ES2015、ECMAScript6(转载)
阮一峰博客系列: http://es6.ruanyifeng.com/#README
- [angularjs] angularjs系列笔记(四)过滤器
过滤器可以使用一个管道字符(|)添加到表达式和指令中,这不就是模板函数吗 <body> <div ng-app="Home"> <div ng-con ...
- 深入理解Redis内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...
- lnmp环境切换php版本,并安装相应redis扩展
ubuntu+nginx+mysql+php+redis,其中php装两个版本,php7和php56 1.让nginx支持不同站点可以选择不同的php版本 1>创建fastcgi.conf文件 ...
- js正整数正则表达式
function testNumber(){ var yourinputValue=$("#yourinputId").val(); var reg = /^[1-9]\d*$/; ...
- [jQuery]相对父级元素的fixed定位
(function($) { var DNG = {}; //----------------------------------------------------/ // ...