当前位置: 首页 > article >正文

【C++11及其特性】智能指针——auto_ptr

auto_ptr目录

  • 一.为什么要使用智能指针
    • 1.内存泄漏
    • 2.解决方法
  • 二.auto_ptr(C++98)
    • 1.用法
    • 2.get()
    • 3.release()
    • 4.reset()
  • 三.注意事项
    • 1.全局定义
    • 2.auto_ptr动态内存分配
    • 3.auto_ptr变量赋值
  • 四.完整代码

一.为什么要使用智能指针

1.内存泄漏

定义了一个测试类:

#include <iostream>
#include <memory>
using namespace std;

class Test
{
public:
	Test()
	{
		cout << "这是构造函数!" << endl;
		value = 1;
	}
	~Test()
	{
		cout << "这是析构函数!" << endl;
	}

	int getValue()
	{
		return value;
	}

private:
	int value;
};

动态内存分配忘记释放了
在这里插入图片描述
即使delete了,但是代码没走到:
在这里插入图片描述

int main()
{
	memory_leak_demo1();
	
	try
	{
		memory_leak_demo2();
	}
	catch (const std::exception&e)
	{
		cout << "catch exception:" << e.what() << endl;
	}
	return 0;
}

就都没有走到析构函数.
在这里插入图片描述

2.解决方法

为了解决内存泄漏的问题,我们参考布局的变量为什么不会内存泄漏,函数调用完就自动释放.
那是因为生命周期.

所有我们就想有没有一种对象可以来管理指针,这个对象是有生命周期的,一旦结束就会调用析构函数,在析构函数里面又可以来释放我们的指针.

没错这就是智能指针,让动态内存分配的释放,不在让我们程序员担心.
先来讲讲模版类auto_ptr

二.auto_ptr(C++98)

1.用法

需要头文件.
在这里插入图片描述
定义格式:auto_ptr<类型> 变量名(new 类型)
在这里插入图片描述
其用法与指针无异
在这里插入图片描述

2.get()

可获取定义时保存的指针.
在这里插入图片描述

3.release()

取消对这个指针的管理,又回到只能手动释放了.
在这里插入图片描述

4.reset()

可以重新设置指针,原来的指针会自动的释放.
在这里插入图片描述

三.注意事项

1.全局定义

全局定义,那么生命周期一直存在,无法进行释放.
在这里插入图片描述

2.auto_ptr动态内存分配

这就不跟我们普通定义的指针一样了嘛,还是无法释放新的,捡了芝麻丢了西瓜.
在这里插入图片描述

3.auto_ptr变量赋值

都保存同样的地址会出问题,要是一个先释放的话,后面那个怎么办.
在这里插入图片描述

四.完整代码

#include <iostream>
#include <memory>
using namespace std;

class Test
{
public:
	Test()
	{
		cout << "这是构造函数!" << endl;
		value = 1;
	}
	~Test()
	{
		cout << "这是析构函数!" << endl;
	}

	int getValue()
	{
		return value;
	}

private:
	int value;
};

auto_ptr<Test>t(new Test());//毫无意义

void memory_leak_demo1()
{
	//Test* t1 = new Test();

	auto_ptr<Test>* p = new auto_ptr<Test>(new Test());//毫无意义



	//auto_ptr<Test>t(new Test());
	//auto_ptr<Test>t1;
	//t1 = t;//最好不要这样做

	cout <<"value:" << t->getValue() << endl;
	cout <<"value:" << (*t).getValue() << endl;

	Test*tmp=t.get();//获取保存的指针
	cout << "tmp访问value:" << tmp->getValue() << endl;

	tmp=t.release();//取消对指针的托管,需要自己手动释放内存了
	delete tmp;

	t.reset();//重新托管其他指针,原来的会释放掉,不写为空指针.
	t.reset(new Test());



	return;
}

void memory_leak_demo2()
{
	Test* t1 = new Test();

	//假如中间出现了文件不存在问题抛出异常
	
	throw exception("文件不存在");

	delete t1;//即使我delete了,但是还是可能走不到这里,导致内存泄漏
	return;
}

int main()
{
	memory_leak_demo1();
	
	/*try
	{
		memory_leak_demo2();
	}
	catch (const std::exception&e)
	{
		cout << "catch exception:" << e.what() << endl;
	}*/
	return 0;
}

运行结果:
在这里插入图片描述

auto_ptr只是一个抛砖引玉,比较是C++98老版本的.


http://www.kler.cn/a/287052.html

相关文章:

  • YOLOv9改进,YOLOv9检测头融合RFAConv卷积,适合目标检测、分割任务
  • 查看电脑或笔记本CPU的核心数方法及CPU详细信息
  • vue2 - Day05 - VueX
  • 计算机系统原理:一些断言
  • 利用rsync备份全网服务器数据
  • python助力WRF自动化运行
  • Java Operator SDK
  • YarnClient发送和接收请求源码解析
  • 深度学习复盘与论文复现G 项目维护
  • NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版
  • 2024.9.1 Python,跳跃游戏,贪心算法,回溯算法复原 IP 地址,关于回溯过程中列表的[:]以及copy问题再讨论
  • Flowable之传阅功能实现
  • 今日算法:蓝桥杯基础题之“星期一”
  • easyExcel 单元格合并
  • C++开发基础之宏定义:入门、中级、高级用法示例解析
  • 计算机毕业设计选题推荐-体育馆场地预约系统-Java/Python项目实战
  • OpenHarmony开发:应用分层架构设计
  • 汽车免拆诊断案例 | 2012 款大众速腾车发动机偶尔抖动
  • 【Python机器学习】NLP词中的数学——齐普夫定律
  • vue点击事件
  • Mac怎么安装谷歌浏览器
  • 算法-汇总区间(228)
  • FFmpeg源码:append_packet_chunked、av_get_packet函数分析
  • Android自定义View实现彩虹进度条(带动画)
  • 完美解决Jenkins重启后自动杀掉衍生进程(子进程)问题
  • ​哈哈题库​邀请书