如何理解智能指针,什么时候改变引用计数

您所在的位置:网站首页 引用计数器底层实现原理是什么 如何理解智能指针,什么时候改变引用计数

如何理解智能指针,什么时候改变引用计数

2024-07-15 17:01| 来源: 网络整理| 查看: 265

前言 在C++项目开发中,有时候会遇到悬垂指针的问题,其中提供的解决方案推荐使用智能指针。 在《C++Primer》书13.5章 提到了该技术的具体使用场景和实现。通过反复阅读和代码测试终于了解其中的思想,下面谈谈自己的理解,如果发现有什么问题,请大家批评指正。

什么是智能指针? 智能指针其实就是一个类,除了增加了一些功能外,其因为跟跟普通指针一样。通常情况,new一个对象会申请一块内存,复制或者赋值时,会导致多个指针指向同一个内存区域,如果对其中任意一个指针进行操作,比如修改指针指向的值,那么其它指针也指向的值都会改变,如果删除了其中一个指针所指向的对象,那么其它指针所指向的对象也都不存在了,这些指针也就变成悬垂指针了。另外如果new出的对象还没有到delete方法执行那么就好造成内存泄漏。智能指针主要目的就是管理这块内存,避免内存泄漏和悬垂指针。

为什么要使用智能指针? 上述说得对象复制或者赋值的时候会导致多个指针指向同一个内存区域,那么只要我们重写这个两个方法,采用深复制那么就不会出现该问题了吧。答案确实是可以的,但是这样如果被复制的对象较大并且使用很频繁,同时只是获取对象值的情况,这样做无疑增加了内存开销也影响性能。所以这时候可以考虑智能指针实现。

C语言、C++语言没有自动内存回收机制,关于内存的操作的安全性依赖于程序员的自觉。程序员每次new出来的内存块都需要自己使用delete进行释放,流程复杂可能会导致忘记释放内存而造成内存泄漏。而智能指针也致力于解决这种问题,使程序员专注于指针的使用而把内存管理交给智能指针。

我们先来看看普通指针的悬垂指针问题。当有多个指针指向同一个基础对象时,如果某个指针delete了该基础对象,对这个指针来说它是明确了它所指的对象被释放掉了,所以它不会再对所指对象进行操作,但是对于剩下的其他指针来说呢?它们还傻傻地指向已经被删除的基础对象并随时准备对它进行操作。于是悬垂指针就形成了,程序崩溃也“指日可待”。我们通过代码+图来来探求悬垂指针的解决方法。

普通指针的问题 一个带有简单指针的类: 图示:

 

代码测试: hasPtr.h

#ifndf _HasPtr_H #define _HasPtr_H class HasPtr { public: HasPtr(int *p = 0, int i = 0); ~HasPtr(); int *get_ptr() const; void set_ptr(int *p); int get_int() const; void set_int(int i); int get_ptr_val() const; void set_ptr_val(int val); private: int *ptr; int val; }; #endif

hasPtr.cpp

#include "hasPtr.h" #include using namespace std; HasPtr::HasPtr(int *p, int i) :ptr(p) ,val(i) { } int *HasPtr::get_ptr() const { return ptr; } void HasPtr::set_ptr(int *p) { ptr = p; } int HasPtr::get_int() const { return val; } void HasPtr::set_int(int i) { val = i; } int HasPtr::get_ptr_val() const { return *ptr; } void HasPtr::set_ptr_val(int val) { *ptr = val; } HasPtr::~HasPtr() { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3