首页 > 代码库 > 【C++】智能指针简述(六):智能指针总结及补充

【C++】智能指针简述(六):智能指针总结及补充

  本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容.

总结:

  1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时,对资源进行清理和汕尾.

  2.auto_ptr,防止拷贝/赋值对象后,析构时多次delete对象导致程序崩溃,因此它通过“转移所有权”,完成赋值/拷贝,保证只有一个对象维护、释放指针.实际开发中,并不常用.

  3.scoped_ptr与auto_ptr类似,只是它不会“转移所有权”,而是禁止对象的拷贝/赋值.(把拷贝构造函数、赋值运算符重载设为private,并且只给出声明,不提供定义)

  4.shared_ptr,通过引用计数来管理指针,当出现新对象维护同一块指针时,引用计数增加.当引用计数为1时,才真正的delete指针.

  5.weak_ptr,解决shared_ptr循环引用的问题,与shared_ptr一起使用,不能单独使用.

补充:shared_ptr定制删除器

  通过前文,我们已经知道shared_ptr是比较实用的智能指针.

  我们可以通过非常简洁的语句管理指针:

#include<iostream>
#include<memory>
using namespace std;
int main(){
	shared_ptr<int> sp1(new int(10));
	cout<<*sp1<<endl;
	*sp1 = 20;
	cout<<*sp1<<endl;
        return 0;
}

  对于我们动态申请的内存,构造时完成初始化,析构时通过delete来释放没有任何问题.

  但,倘若是一个文件类型的指针呢?

#include<iostream>
#include<memory>
using namespace std;
int main(){
	shared_ptr<FILE> sp1(fopen("test.txt","w"));
	//如果不进行任何特殊处理,则程序崩溃!
	return 0;
}

  因此,shared_ptr提供了删除器功能,我们可以通过定制删除器,来对特定的资源进行回收.

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

//仿函数
struct Fclose{
	void operator()(void *ptr){
		fclose((FILE*)ptr);
		cout<<"不用担心,shared_ptr已经通过调用我关闭了文件!"<<endl;
	}
};

int main(){
	//我们通过传入仿函数,来完成对文件指针的清理
	shared_ptr<FILE> sp1(fopen("test.txt","w"),Fclose());
	return 0;
}

  至此,定制shared_ptr删除器部分到这里就已经完美收官了!

  那么,智能指针部分到这里就告一段落了....感谢阅读!

【C++】智能指针简述(六):智能指针总结及补充