码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++智能指针简介


    文章目录

    • 前言
    • 一、C语言和C++中的动态内存申请
    • 二、智能指针的创建
    • 总结


    前言

    这篇文章将为大家带来智能指针,很多人都听过指针但是智能指针对于大家来说可能会很陌生。

    一、C语言和C++中的动态内存申请

    在C语言使用malloc进行动态内存的申请
    在C++中使用new进行动态内存的申请
    C语言:

    	int *p = (int*)malloc(4);
    
    • 1

    C++

    	int *p = new int;
    
    • 1

    在C语言和C++中使用malloc和new进行动态内存的申请,最终返回的都是指针类型。
    我们申请了一段空间就必须要释放,否则就会发生内存泄漏。
    在C语言和C++中分别使用free和delete进行内存的释放。
    C语言:

    	free(p);
    
    • 1

    C++

    	delete p;
    
    • 1

    这样看起来只要遵守申请了内存就进行释放那就不会出现什么问题了。但是很多人申请内存后就会忘记释放,或者对同一块内存空间进行多次释放。这样就会导致很严重的BUG。
    所以我们需要引入一个新的概念智能指针,智能指针可以自动释放申请到的内存,而且还保证不能多次释放同一块内存空间。

    二、智能指针的创建

    这里我们使用自定义类创建一个智能指针。
    在析构函数中释放掉申请的内存,当程序结束时,动态申请的内存也就被释放了,这样就保证了内存不会被释放的问题了。

    class Test
    {
    public:
    	Test()
    	{
    		cout << "Test()" << endl;
    	}
    	~Test()
    	{
    		cout << "~Test()" << endl;
    	}
    };
    
    class point
    {
    	Test* mp;
    public:
    	point(Test* p = NULL)
    	{
    		mp = p;
    	}
    	point(const point& obj)
    	{
    		mp = obj.mp;
    		const_cast<point&>(obj).mp = NULL;
    	}
    	point& operator = (const point& obj)
    	{
    		if (this != &obj)
    		{
    			delete mp;
    			mp = obj.mp;
    			const_cast<point&>(obj).mp = NULL;
    		}
    	}
    	Test& operator * ()
    	{
    		return *mp;
    	}
    	Test* operator -> ()
    	{
    		return mp;
    	}
    	~point()
    	{
    		delete mp;
    	}
    };
    
    
    int main()
    {
    	point p = new Test();
    
    	point p1(p);
    	
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    这里还重载了->和*操作符保证了可以和指针一样的使用方法。

    总结

    智能指针使用起来是非常方便的,有了智能指针我们就可以避免动态内存申请时出现内存泄漏等问题了。大家下去多理解一下智能指针,这个在以后的工程开发当中还是很有用的,有什么地方不懂的大家可以留言或者私信。

  • 相关阅读:
    人工智能、深度学习、机器学习常见面试题321~324
    记一次 .NET某列控连锁系统 崩溃分析
    【问题总结】 记 一次dockerFile构建报错
    基于Java+Vue+uniapp微信小程序实现餐厅校园订餐平台
    多平台推广时 如何找到你的高价值广告投放平台?
    MFC 对话框
    springboot昆明学院档案管理系统 毕业设计-附源码311758
    Py之yellowbrick:yellowbrick的简介、安装、使用方法之详细攻略
    Llama2-Chinese项目:4-量化模型
    RabbitMQ的特点
  • 原文地址:https://blog.csdn.net/m0_49476241/article/details/127949872
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号