智能指针介绍

在C++中,我们都知道在堆区new 开辟的内存,必须通过delete 进行内存释放,不然会形成内存泄漏。有时候我们使用了new 后在 写了很多代码,忘记delete 也是很正常的。那么我们可以使用智能指针来避免这种情况,当new内存的使用将放到智能指针内,就可以不用考虑释放问题了。智能指针会帮助我们实现在堆区new的内存的释放

智能指针原理

我们的智能指针类,肯定要包含一个 原始的指针,智能指针 在栈上开辟,那么智能指针一定会被释放掉,一定会走智能指针的析构函数,所有我将 真正在堆上new的内存在 智能指针的析构函数进行释放!

我们将智能指针包裹普通指针后,但是我们还想和原来使用普通指针一样使用-> 和 *那么肯定要重载运算符,将原始指针进行返回

代码不是很多长,主要就是->、* 运算符的重载 和 模板技术的应用。下面请看代码:

智能指针实现代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//Person类测试 智能指针
class Person
{
public:Person(int age,string name){cout << "Person(int age,string name)" << endl;m_Age = age;m_Name = name;}~Person(){cout << "~Person()" << endl;}//显示人物信息void showInfo(){cout << "name = " << m_Name << ", age = " << m_Age << endl;}private:int m_Age;string m_Name;
};//模板 + 指针运算符重载 构成智能指针
template<class classType>
class SmartPointer
{
public:SmartPointer(classType* pointer){cout << "SmartPointer(classType* pointer)" << endl;this->pointer = pointer;}~SmartPointer(){cout << "~SmartPointer()" << endl;if (this->pointer != NULL){delete this->pointer;}}//重载 -> 指针运算符classType* operator->(){return this->pointer;}//重载 *  解引用运算符classType& operator*(){return *(this->pointer);}
private:classType* pointer;
};int main05(int argc, char *argv[])
{/*智能指针 只能在栈上建立,这样智能指针一定可以被释放,那么普通指针就 可以不用管释放的问题,统一由智能指针帮忙释放实质上用智能指针 将普通指针包起来。*/SmartPointer<Person> p = SmartPointer<Person>(new Person(18, "Laymond"));p->showInfo();(*p).showInfo();return EXIT_SUCCESS;
}

代码运行结果

看到没有,智能指针 自动帮忙进行释放,而且使用方式和原来普通指针没有区别哟。

智能指针:-和*运算符重载 + 模板技术 实现智能指针(C++)相关推荐

  1. 基于数据挖掘的智能家居:如何利用数据挖掘技术提高智能家居的体验?

    文章目录 基于数据挖掘的智能家居:如何利用数据挖掘技术提高智能家居的体验? 1. 引言 2. 技术原理及概念 2.1. 数据收集 2.2. 数据预处理 2.3. 数据挖掘算法的实现 2.4. 数据可视 ...

  2. 大数据 智能交通调度_大数据技术在智能交通中的应用

    龙源期刊网 http://www.qikan.com.cn 大数据技术在智能交通中的应用 作者:庄斌 来源:<名城绘> 2018 年第 04 期 摘要:随着时代的发展和社会需求变化,现代智 ...

  3. C++之运算符重载(上)

    1.概念 所谓重载,就是重新赋予新的含义.函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的函数,也就是"一名多用". 运算符也可以 ...

  4. c++中运算符重载方式中你易遗漏的小细节

    运算符重载函数相当于类来说有两种存在方式: 1.重载为类的成员函数. 2.重载为类的友元函数. 重载为类的成员函数. 如果把运算符重载为类的成员函数,则该函数么须通过对象调用,该对象就是运算符的其中一 ...

  5. 运算符重载(加减运算符、前置加加(减减)后置加加(减减)运算符、赋值运算符、输入输出运算符、关系运算符、函数调用)

    编译器对于一个类会默认生成以几种函数: 1.默认构造函数(空形参,空函数体) 2.默认拷贝构造函数(浅拷贝,也叫值拷贝.字节拷贝) 3.析构函数(空形参,空函数体.析构函数要求形参列表必须是空的,所以 ...

  6. C++入门:构造函数,析构函数,拷贝构造函数,运算符重载详解

    目录 类的6个默认成员函数 一.构造函数 1.概念 2.特征如下: (1) 函数名与类名相同. (2)无返回值. (3)对象实例化时编译器自动调用对应的构造函数. (4)构造函数可以重载. (5)如果 ...

  7. C++实现日期类(运算符重载)

    日期类的实现 经历前期C语言的学习,C语言的编程思路是面向过程的编程,将所需要实现的功能封装为每一个功能函数,在主函数中进行调用 C++编程思想是面向对象的编程,相比较于C语言的编程,它更具有更高的安 ...

  8. 怎么new一个指针_C++知识点 34:指针运算符重载 -- 智能指针

    #define _CRT_SECURE_NO_WARNINGS #include using namespace std; // 平常可能遇到一个问题 class Test { public: Tes ...

  9. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

最新文章

  1. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型
  2. C语言 位移运算符的使用
  3. 面向对象的特点封装、继承、多态
  4. 泡泡玛特就“女性面试需填生育计划”一事致歉 称将积极改进
  5. npm install 时候报错 gifsicle@5.2.0 postinstall: `node lib/install.js`
  6. 洛谷P1880 石子合并 区间动归
  7. ValueError: This sheet is too large! Your sheet size
  8. linux内核编程之内核定时器
  9. CentOS 7.x 内核kernel版本升级实操
  10. python的下载与安装小牛学堂_Python学习_Day1
  11. 吃糖果 (HDU-1205)(鸽笼原理(抽屉原理))
  12. M3D GIS三维数字沙盘可视化交互地理信息系统开发教程第44课
  13. VS2017 创建安装项目模板
  14. 使用css实现水珠/水滴效果
  15. 《C语言实战教学》:程序式思维及C语言介绍
  16. crackme01——Acid_burn
  17. 嘿~你想写出五彩斑斓的BUG吗
  18. abap基础表之间的联系
  19. 医院计算机岗位实践报告,it实习报告范文3000字
  20. js 在当前时间加一小时

热门文章

  1. Blizzard Transitions for Mac - 动态风雪过渡效果FCPX转场
  2. Mac Backup软件:不要冒险您的数据!
  3. flash倒计时_11款免费又好用的PPT倒计时神器
  4. 1.10 编程基础之简单排序 04 奖学金 7分 python
  5. 32销售是合理的引导用户购买
  6. css中如何实现帧布局_?如何在Python中加入多个数据帧?
  7. c纳秒级计时器_纳秒级性能计时器
  8. Qt笔记-解决QSocketNotifier: Multiple socket notifiers for same socket xxx and type Read问题
  9. Arduino笔记-Rouch Sensor的使用
  10. C++与QML交互(信号与槽通知QML,C++注册QML,QML结点映射C++类)