0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++智能指针的学习方法介绍

Q4MP_gh_c472c21 来源:CSDN博客 作者:CSDN博客 2020-09-02 13:54 次阅读

一、智能指针的学习:

1、内存泄漏:

关于内存泄漏这个问题,一般都会牵扯到指针这个话题,也就是我们常说的动态内存分配;然而在程序员手动进行堆空间的分配时(指针无法控制所指堆空间的生命周期,),往往在写完程序的时候,程序员一不小心就忘了释放已经手动分配的内存大小,导致软件Bug不断(也就是内存泄漏)。

C++语言里面又没有垃圾回收的机制(不像高级语言Java有自动的垃圾回收机制,),所以程序员在写程序的时候,经常会发生刚才上面说的那种情况,这里我们来看一个例子:

#include 《iostream》

#include 《string》

using namespace std;

class Test

{

int i;

public

Test(int i)

{

this-》i = i;

}

int value()

{

return i;

}

~Test()

{

}

};

int main()

{

for(int i=0; i《5; i++)

{

Test* p = new Test(i);

cout 《《 p-》value() 《《 endl;

}

return 0;

}

输出结果:

txp@ubuntu:~$ 。/a.out

0

1

2

3

4

注解:上面分配的堆空间,没有释放掉

2、我们需要什么?

需要一个特殊的指针: 智能指针对象,通过类的普通构造函数完成;

指针生命周期结束的时候,主动释放堆空间

一片堆空间最多只能由一个指针标识:避免多次释放内存,通过拷贝构造函数和赋值操作符完成;

杜绝指针运算和指针比较

3、智能指针的使用:

重载指针特征操作符(-》和*)

只能通过类的成员函数重载

重载函数不能使用参数

只能定义一个重载函数

代码实践:

#include 《iostream》

#include 《string》

using namespace std;

class Test

{

int i;

public:

Test(int i)

{

cout 《《 “Test(int i)” 《《 endl;

this-》i = i;

}

int value()

{

return i;

}

~Test()

{

cout 《《 “~Test()” 《《 endl;

}

};

class Pointer

{

Test* mp;

public:

Pointer(Test* p = NULL)// 1,智能指针对象,通过类的普通构造函数完成;

{

mp = p;

}

Pointer(const Pointer& obj)//避免多次释放内存,通过拷贝构造函数和赋值操作符完成;

{

mp = obj.mp;// 传递堆空间的控制;

const_cast《Pointer&》(obj).mp = NULL;//初始化对象不管之前的;堆空间了,做所有权的转移,保证堆空间最多只能由一个对象被标识;

}

Pointer& operator = (const Pointer& obj)

{

if( this != &obj )

{

delete mp;

mp = obj.mp;

const_cast《Pointer&》(obj).mp = NULL;

}

return *this;

}

Test* operator -》 () // 返回指针,准备指示;

{

return mp;

}

Test& operator * () // 解引用,返回对象;

{

return *mp;

}

bool isNull()

{

return (mp == NULL);

}

~Pointer()

{

delete mp;

}

};

int main()

{

Pointer p1 = new Test(0);

cout 《《 p1-》value() 《《 endl;

Pointer p2 = p1;

cout 《《 p1.isNull() 《《 endl;

cout 《《 p2-》value() 《《 endl;

return 0;

}

输出结果:

txp@ubuntu:~$ 。/a.out

Test(int i)

0

1

0

~Test()

总结提示:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放

二、总结:

指针特征操作符(-》和*)可以被重载

重载指针特征符能够使用对象代替指针

智能指针只能用指向堆空间中的内存

智能指针的意义在于最大程度的避免内存问题

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72903

原文标题:C++之智能指针的学习总结

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    初学者该如何学习C++

    的错误学习方法,很多人认为学习方法真的是一抓一大把,关于这些编程语言的学习方法,程序员总是非常苦恼,想要找到一条符合自己学习的道路其实并没有想象中那么容易,初学者该如何
    发表于 05-22 16:41

    统计的学习方法

    统计学习方法感知机
    发表于 07-15 10:33

    STM32的学习方法分享?

    STM32的学习方法
    发表于 08-14 04:00

    嵌入式学习方法步骤是什么?

    `嵌入式学习方法步骤是什么?我看一些初学者问的很多,分享一下。1.Linux基础及C语言高级学习Linux基础及C语言,对嵌入式C语言有一定
    发表于 10-22 15:23

    学习C++方法以及C++的就业方向

    学习方向:嵌入式+人工智能嵌入式是一门技术学习目标1.嵌入式开发概述;(面向对象在嵌入式开发中角色)2.嵌入式Linux C++编程;(C++
    发表于 12-24 07:32

    STM32的学习方法

    STM32学习方法
    发表于 09-28 06:18

    模拟电子电路的学习方法

    模拟电子电路的学习方法
    发表于 08-07 15:49 252次下载
    模拟电子电路的<b class='flag-5'>学习方法</b>

    基于二次型性能指学习算法的温度控制

    讨论了一种基于二次型性能指学习算法的单神经元温度控制。论文首先介绍了单神经元控制算法的系统结构和学习方法,接着是基于二次型性能指
    发表于 12-08 13:56 12次下载

    第1章 ZigBee简介和学习方法

    ZigBee简介和学习方法很适合入门级别的人学习
    发表于 12-07 18:36 8次下载

    AVR单片机学习方法详解

    详细介绍AVR单片机学习方法,很适合初学者!
    发表于 05-16 17:15 3次下载

    C++指针学习建议

    C++指针学习建议
    发表于 03-31 15:53 3次下载

    C++指针学习建议

     一。对于众多人提出的c/c++指针难学的问题做个总结:
    发表于 11-07 17:13 8次下载
    <b class='flag-5'>C++</b><b class='flag-5'>指针</b>的<b class='flag-5'>学习</b>建议

    rust语言基础学习: 智能指针之Cow

    Rust中与借用数据相关的三个trait: Borrow, BorrowMut和ToOwned。理解了这三个trait之后,再学习Rust中能够实现写时克隆的智能指针Cow。
    的头像 发表于 05-22 16:13 2052次阅读

    联合学习在传统机器学习方法中的应用

    联合学习在传统机器学习方法中的应用
    的头像 发表于 07-05 16:30 548次阅读
    联合<b class='flag-5'>学习</b>在传统机器<b class='flag-5'>学习方法</b>中的应用

    C++智能指针的底层实现原理

    C++智能指针的头文件: #include 1. shared_ptr: 智能指针从本质上来说是一个模板类,用类实现对指针对象的管理。 template class shared_pt
    的头像 发表于 11-09 14:32 297次阅读
    <b class='flag-5'>C++</b><b class='flag-5'>智能指针</b>的底层实现原理