【C/C++学习笔记】C++11 智能指针(TR1)

智能指针介绍

C++11 提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,定义在头文件 <memory> 中。其中auto_ptr 是 C++98 提供的解决方案,C+11 已将其摒弃,并提出了 unique_ptr 作为 auto_ptr 替代方案。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用较新的 unique_ptr,因为 unique_ptr 比 auto_ptr 更加安全。shared_ptr 和 weak_ptr 则是 C+11 从准标准库 Boost 中引入的两种智能指针。

1. auto_ptr 指针

auto_ptr 是C++标准库提供的类模板,auto_ptr 对象通过初始化指向由new创建的动态内存,采用所有权模式。它是这块内存的拥有者,一块内存不能同时被分给两个拥有者当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自动释放。即使发生异常,通过异常的栈展开过程也能将动态内存释放。auto_ptr不支持new 数组。

初始化auto_ptr对象的方法如下:

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

int main()
{
	// 直接构造智能指针
	auto_ptr<string> p1(new string("Hello Ming."));

	//  将已存在的指向动态内存的普通指针作为参数来构造
	int* p = new int(33);
	auto_ptr<int> p2(p);
	std::cout << *p1 << std::endl;
	std::cout << *p2 << std::endl;

	// 利用已经存在的智能指针来构造新的智能指针(拷贝构造)
	auto_ptr<string> p3(p1);  // 此时,p1失去内存所有权,p3获得所有权以及负责内存的自动销毁
	//std::cout << *p1 << std::endl;   // 内存崩溃
	std::cout << *p3 << std::endl;

	// 利用已经存在的智能指针来构造新的智能指针(赋值)
	auto_ptr<int> p4;
	p4 = p2; // p4剥夺了p2的所有权, 且 auto_ptr 不会报错
	//std::cout << *p2 << std::endl;  // 内存崩溃
	std::cout << *p4 << std::endl;
}

由上面的例子可以看出,当auto_ptr的内存所有权被剥夺时,编译器不会报错,导致使用 auto_ptr 指针时存在潜在的内存崩溃的缺点。因此C++11 将其摒弃,并提出了 unique_ptr 作为 auto_ptr 替代方案。

2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值