千家信息网

C++智能指针的用法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"C++智能指针的用法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++智能指针的用法"吧!一、智能指针的学习:1、内存泄漏:关于内存泄
千家信息网最后更新 2026年11月02日C++智能指针的用法

本篇内容主要讲解"C++智能指针的用法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++智能指针的用法"吧!

一、智能指针的学习:

1、内存泄漏:

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

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

#include 
#include

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 
#include

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(obj).mp = NULL;//初始化对象不管之前的;堆空间了,做所有权的转移,保证堆空间最多只能由一个对象被标识;
}
Pointer& operator = (const Pointer& obj)
{
if( this != &obj )
{
delete mp;
mp = obj.mp;
const_cast(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++ 操作符 分配 普通 时候 特征 程序员 学习 也就是 内容 周期 垃圾 手动 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 深圳互联网络科技有限公司 艾特科技互联网 互联网科技ppt模板 睿民互联网科技 狮子座互联网科技培训 哈尔滨新华互联网科技 深圳卡尔迅互联网科技有限公司怎么样 恒银科技与互联网金融 常德市电业局互联网科技部 贵州叶脉互联网科技有限公司所属行业 栖莱科技互联网股份有限公司 佳云科技和互联网广告 江阴互联网智能科技产品进口 高科技互联网发展前景如何 工业互联网展湾科技股份有限公司 科技互联网行业投资研究 普陀区互联网教育科技管理办法 中国互联网公司的科技投入 科技美学互联网 艺术 广州宏创互联网科技 西安互联网科技公司 唐信互联网科技 大连 博兴的互联网电子科技公司 华服互联网科技官网 哈尔滨屹滨互联网科技有限公司 互联网时代的科技公司 山东星卡互联网科技有限公司官网 济南小医互联网科技有限公司招聘 银川新华互联网科技学校招聘
0