码迷,mamicode.com
首页 > 其他好文 > 详细

正确地使用智能指针

时间:2016-06-23 14:23:37      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

C++没有像Java和C#那样存在自动内存回收机制,因此C++的内存管理是每一个C++程序员都要面对的问题。所幸的是,C++提供了智能指针这一机制来帮助我们自动地管理内存分配,大大方便了内存管理。

C++提供了两种智能指针:auto_ptr和shared_ptr,这两种类型都具备自动管理内存资源的功能。当智能指针离开作用域的时候,其指向的内存区块会被自动销毁,防止内存泄漏问题。

对于auto_ptr,注意一定不要让多个auto_ptr同时指向同一对象!它有一个不寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权!

#include <iostream>
#include <memory>
int main()
{
	int* x=new int;
	std::auto_ptr<int> sp(x);//now sp points to x
	std::auto_ptr<int> sp2=sp;//now sp2 points to x,sp is null
	return 0;
}

这种赋值方式明显是很不自然的,因此我们可以通过shared_ptr来管理指针。多个shared_ptr对象可以指向同一个指针,当最后一个指向该指针的shared_ptr对象不再指向它之后,该区域内存就会被自动销毁。

#include <iostream>
#include <memory>
int main()
{
	int* x=new int;
	std::tr1::shared_ptr<int> sp(x);//now sp points to x
	std::tr1::shared_ptr<int> sp2=sp;//now sp2 points to x,sp as well
	return 0;
}

需要注意的是,无论是auto_str还是shared_str,其销毁内存的函数都是delete而不是delete[]。也就是说,如下用法会导致内存泄露:

std::tr1::shared_ptr<int> sp(new int[5]);

但这样是可以通过编译的,因此这是使用智能指针需要注意的一点。

 

正确地使用智能指针

标签:

原文地址:http://www.cnblogs.com/wickedpriest/p/5610397.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!