正确地使用智能指针

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]);

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

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