C++ 智能指针

前言

c++ 中new开辟的内存,离开作用域时需要手动释放,不然会造成内存泄露,因此, 如果将 new 返回的地址赋给智能指针, 将无需 记住 稍后 释放 这些 内存: 在 智能 指针 过期 时, 这些 内存 将 自动 被 释放。

什么是指针

c++指针详解

auto_ptr

void TestAutoPtr() {
	auto_ptr<String>s1(new String("dms"));
	auto_ptr<String>s4;
	s4 = s1;//可以但是后面使用s1会出现问题
	//cout << *s1 << endl; //error:s1不再指向有效数据
}
int main()
{
	TestAutoPtr();
}

自定义String类析构函数中输出内容:

String::~String()
{
	num_string--;
	std::cout << "释放:" << *this << std::endl;
	delete[] str;
}

运行结果如下
在这里插入图片描述
可以看到new出的内存被自动释放了,需要注意的是s1赋值给s4 时s1的权力将被剥夺,不再指向有效数据

unique_ptr

void TestUniquePtr()
{
	unique_ptr<String>s2(new String("uniquedd"));
	unique_ptr<String>s3;
	//s3 = s2; //非法操作 
	unique_ptr<String[]>s5(new String[5]); //允许数组
	//auto_ptr<String[]>s6(new String[5]); //不允许数组
}

在这里插入图片描述
相较于auto_ptr,unique_ptr对于赋值操作为非法操作,防止犯错,而且unique_ptr支持数组而auto_ptr不支持。

shared_ptr

void TestSharedPtr() {
	shared_ptr<String>s7(new String("share"));
	shared_ptr<String>s8, s9;
	s8 = s7;
	s9 = s7;
	cout << *s7 << " " << *s8 << " " << *s9 << endl;
	shared_ptr<String[]>s10(new String[5]);
}

在这里插入图片描述

相比前两种智能指针,shared_ptr支持赋值操作也支持数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值