本篇内容介绍了“C++如何解决垃圾回收问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
我们了解到我们在浅拷贝时对带指针的对象进行拷贝会出现内存泄漏,那C++是否可以实现像python,JAVA一样引入
垃圾回收机制,来灵活的来管理内存。
遗憾的是C++并不像python、java等编程语言一样有着垃圾回收机制(Gabage Collector),因此导致了C++中对动态
存储的管理称为程序员的噩梦,出现了内存遗失(memory leak)、悬空指针、非法指针存取等问题。
Bjarne本人认为:
“我有意这样设计C++,使它不依赖于自动垃圾回收(通常就直接说垃圾回收)。这是基于自己对垃圾回收系统的经验,
我很害怕那种严重的空间和时间开销,也害怕由于实现和移植垃圾回收系统而带来的复杂性。还有,垃圾回收将使C+
+不适合做许多底层的工作,而这却正是它的一个设计目标。但我喜欢垃圾回收的思想,它是一种机制,能够简化设计、
排除掉许多产生错误的根源。
C++中提供的构造函数和析构函数就是为了解决了自动释放资源的需求。Bjarne有一句名言,“资源需求就是初始化(Resource Inquirment Is Initialization)”。
因此,我们可以将需要分配的资源在构造函数中申请完成,而在析构函数中释放已经分配的资源。
在C++中,允许你控制对象的创建,清楚和复制,我们就可以通过开发一种称为引用计数的垃圾回收机制实现这种控制
首先我们明确在对存在指针的对象构造时,析构对象时需要把指针delete(释放掉),但是此时如果我们对对象进行浅拷贝,没有新的指针new。
析构对象时候会出现内存泄漏(一个指针所指的内存被两次释放的清况),我们用通过引用计数来解决这个问题:
每构造一个对象,就创建一个新的计数器并+1.每拷贝构造一次就在被拷贝的那个对象所在的计数器上+1;
析构时候 按照构造函数析构的顺序(后造先放,类似栈),最后构造或拷贝的先释放;
每次释放先对计数器-1并判断计数器是否为0(是否存在浅拷贝的对象),大于0时,继续按照析构顺序析构下一个对象;
免费云主机域名
当计数器为0时,释放指针。
我们按顺序构造3个对象,计数器标号记为 1,2,3,对第一个和第三个对象浅拷贝两次,
对对象拷贝完成后计数器1,2,3的值分别为 2 1 2.
先释放计数器3 计数器-1后等于1,析构掉一个对象。计数器为 2 1 1
再释放计数器1 计数器-1后等于1,析构掉一个对象。计数器为 1 1 1
再释放计数器3 计数器-1后等于0,析构掉一个对象,并释放掉指针。计数器为 1 1 空
再释放计数器2 计数器-1后等于0,析构掉一个对象,并释放掉指针。计数器为 1 空 空
再释放计数器1 计数器-1后等于0,析构掉一个对象,并释放掉指针。计数器为 空 空 空
最终所有对象析构完毕,指针也全部释放完
调试这个程序,我们在完成构造和拷贝后,查看内存,可以看到此时计数器1,2,3分别对应的值为2,1,2
单步跟入,看到第一个拷贝构造的对象被析构掉,计数器值-1 ,此时3个计数器值分别为为2,1,1
再继续往后走,发现第二个拷贝对象析构掉切指针所指的内存还未被释放掉,计数器1 -1,此时计数器值为 1,1,1
再向后执行,此时第三个构造的对象开始被析构掉同时计数器减到0,此时对象3的指针被释放掉。
加上辅助调试代码,最终可以看到执行结果,构造3次,拷贝2次,释放3次,完成了引用计数功能
“C++如何解决垃圾回收问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!
这篇文章主要介绍了微信小程序如何实现图片双滑缩放大小 ,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在做小程序开发的过程中,后端传来一张图片地图,需要实现双手指滑动,使图片缩放,最终得出了一下…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。