C++11的智能指针

       在C++98中,智能指针通过一个模板类型“auto_ptr”来实现。auto_ptr以对象的方式管理堆内存的分配,并在适当的时间,释放所获得的堆内存。这种堆内存管理的方式只需要程序员将new操作返回的指针作为auto_ptr的初始值即可,程序员不用显式地调用delete。比如:

auto_ptr<int> ptr(new int);

        这在一定程度上避免了堆内存忘记释放而造成的问题。不过auto_ptr有一些缺点(拷贝时返回一个左值,不能调用delete[]等),所以在C++11标准中被废弃了。

        C++11标准中改用unique_ptr、shared_ptr及weak_ptr等智能指针来自动回收堆分配的对象。一起看看新的智能指针的使用。

#include <memory>
#include <iostream>
#include <string>

using namespace std;
int main()
{
	unique_ptr<int> up1(new int(11));       //无法复制的unique_ptr
	cout << *up1 << endl;

	up1.reset();                            //显式释放内存

	shared_ptr<int>sp1(new int(22));        //共享堆内存
	shared_ptr<int> sp2 = sp1;

	cout << *sp1 << endl;
	cout << *sp2 << endl;
	sp1.reset();
	cout << *sp2 << endl;
}

运行结果:

11
22
22
22

unique_ptr是一个删除了拷贝构造函数、保留移动构造函数的指针封装类型,仅可以使用使用右值对unique_ptr对象进行构造,而且一旦构造成功,右值对象中的之后怎即被“窃取”,一次改右值对象即可失去了对指针的所有权。

shared_ptr允许多个改智能指针共享地“拥有”同一堆分配对象的内存,实现上采用了引用计数,所以一旦一个shared_ptr指针放弃了“所有权”,其他的shared_ptr对对象内存的引用并不会收到影响,只会导致引用计数的降低,只有在引用计数变为零的时候,才真正释放所占有的堆内存。

weak_ptr的使用更为复杂一点,可以指向shared_ptr指针指向的对象内存,并不拥有该内存。而是用weak_ptr成员lock,可以返回其指向内存的一个share_ptr对象,且在所有对象内存已经无效时,返回指针空值,这在验证share_ptr智能指针的有效性上会很有作用。示例如下:

#include <memory>
#include <iostream>
#include <string>

using namespace std;

void Check(weak_ptr<int> &wp)
{
	shared_ptr<int>sp = wp.lock();
	if (sp != nullptr)
	{
		cout << "still" << *sp << endl;
	}
	else
	{
		cout << "pointer is invalid" << endl;
	}
}

运行结果:

22
22
still22
22
still22
pointer is invalid

虽然智能指针能帮助用户进行有效的堆内存管理,但是它还是需要程序显式地声明智能指针,而完全不需要考虑回收指针类型的内存管理方案可能更讨人喜欢,这种方案早就有了,就是垃圾回收机制,具体的参考下一篇博文。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值