标准库 智能指针( 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;
}

github完整代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

c/c++ 标准库 智能指针( smart pointer ) 是啥玩意儿的更多相关文章

  1. C++ 标准库智能指针

    整理一下c++中shared_ptr,weak_ptr,unique_ptr三种指针的使用案例和注意事项,让程序资源更加案例,在标准库中,需要包含<memory>,在boost库中, 一. ...

  2. (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

     转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...

  3. 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

    一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...

  4. C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)

    1.野指针的概念.成因以及避免 首先,来说说什么是野指针,所谓野指针就是一个指向未申请访问受限的内存区域或者已经删除了的对象的指针. 什么意思呢?就是本来一个指针指向一个对象.一块内存,但是由于程序( ...

  5. c++(smart pointer)

    (一)首先对智能指针有一些概念性的了解 **********本部分内容摘自开源中国社区http://my.oschina.net/u/158589/blog/28994******** 1.什么是智能 ...

  6. C++智能指针shared_ptr

    shared_ptr 这里有一个你在标准库中找不到的—引用数智能指针.大部分人都应当有过使用智能指针的经历,并且已经有很多关于引用数的文章.最重要的一个细节是引用数是如何被执行的—插入,意思是说你将引 ...

  7. c++ 智能指针(转)

    智能指针的使用 智能指针是在 <memory> 标头文件中的 std 命名空间中定义的. 它们对 RAII 或“获取资源即初始化”编程惯用法至关重要. 此习惯用法的主要目的是确保资源获取与 ...

  8. 智能指针 auto_ptr、scoped_ptr、shared_ptr、weak_ptr

    什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法. RAII又叫做资源分配即初始化,即:定义 ...

  9. 现代C++学习笔记之一入门篇:智能指针(C++ 11)

    原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保 ...

随机推荐

  1. 【杂谈】FilterChain相关知识整理

    前言 做后台的,Filter肯定没少配置,但是知晓其原理的可能不多.在这之前我也不懂,但这并不影响业务开发,同时也有其他的知识要学,所以一直就没看.这阵子有点闲,刚好在看<How Tomcat ...

  2. Linux下FTP虚拟账号环境部署总结

    vsftp的用户有三种类型:匿名用户.系统用户.虚拟用户.1)匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous.2)本地用户登录:使用系统用户登录,在/etc/passwd中 ...

  3. shiro源码篇 - shiro的session创建,你值得拥有

    前言 开心一刻 开学了,表弟和同学因为打架,老师让他回去叫家长.表弟硬气的说:不用,我打得过他.老师板着脸对他说:和你打架的那位同学已经回去叫家长了.表弟犹豫了一会依然硬气的说:可以,两个我也打得过. ...

  4. 痞子衡嵌入式:让你从此高效写作的轻量级标记语言(Markdown)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是轻量级标记语言Markdown. 1.假如你有过这样的烦恼? 想写出排版优雅简洁的文章,并且能够轻易地发表(连同文字和排版)到各大网站上 ...

  5. Go基础系列:接口类型断言和type-switch

    接口类型探测:类型断言 接口实例中存储了实现接口的类型实例,类型的实例有两种:值类型实例和指针类型实例.在程序运行过程中,接口实例存储的实例类型可能会动态改变.例如: // ins是接口实例 var ...

  6. Python系列:一、Python概述与环境安装--技术流ken

    Python简介 Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项 ...

  7. hadoop小结

    测试小结:1.如果只需要对数据集进行过滤,筛选则只需要编写Mapper类,不需要Reduce类,此时要执行下面一条语句:job.setNumReduceTesk(0);2.如果需要对处理的数据进行分组 ...

  8. 前端学习(一) —— HTML

    1.js跳转 window.location.href='url'; 2.div显示与隐藏 hide() show() 3.判断是否为一个字符串是否为整形 function isInt(str){ v ...

  9. 在Fragment中保存WebView状态

    http://www.lucazanini.eu/2013/android/how-to-save-the-state-of-a-webview-inside-a-fragment-of-an-act ...

  10. No application encryption key has been specified.

    环境:php7.1.10laravel5.5出现: 解决:在根目录下执行: php artisan key:generate OK问题解决