关于智能指针的一些使用 auto_ptr shared_ptr unique_ptr

前言

1.智能指针ps有一个析构函数, 该析构函数将在ps过期时释放它指向的内存。
2.使用智能指针需要包含的库#include<memory>
3.智能指针使用泛型,所以应该用泛型定义方式。

//创建智能指针时必须提供额外的信息,指针可以指向的类型:
	shared_ptr<string> p;
	shared_ptr<vector<int>> a;
		/*最安全的分配和使用动态内存的方法就是调用一个名为make_shared的标准库函数,
	此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr
	*/
	shared_ptr<int> p3 = make_shared<int>(42);
	shared_ptr<string> p4 = make_shared<string>(5, '9');
	shared_ptr<int> p5 = make_shared<int>();//不传递任何参数,则被默认初始化
	cout <<"p4="<< *p4 << endl;
	cout << "p5=" << *p5 << endl;
	//三种指针均可用如下方式定义
	auto_ptr<string> ps(new string); 
	unique_ptr<int> pdu(new int);
	shared_ptr<string> pss(new string); 
	*ps = "abc";
	cout << *ps << endl; 

auto_ptr

auto_ptr采用所有权概念,对于特定的对象只有一个指针能够拥有它,而赋值语句可以转让所有权,只有当拥有对象的智能指针的析构函数会删除该对象

	auto_ptr<string> films[5] = {
		auto_ptr<string>(new string("dad")),
		auto_ptr<string>(new string("man")),
		auto_ptr<string>(new string("man")),
		auto_ptr<string>(new string("man")),
		auto_ptr<string>(new string("man")),
	};
	auto_ptr<string> pwin;
	pwin = films[2];//所有权转让
	//当所有权转让后,films[2]就不再引用该字符,films[2]变为了应该空指针所以以下输出会出错
	/*for (int i = 0; i < 5; ++i)
		cout << *films[i] << endl;*/


	auto_ptr<string> p1(new string("auto"));
	auto_ptr<string>p2;
	p2 = p1;//auto_ptr所有权转让后,p1失去对string对象的引用,但不会保报错

unique_ptr

unique_ptr和auto_ptr 一样采用所有权的概念,但它比auto_ptr 更安全

unique_ptr<string> pp3(new string("unique"));
	unique_ptr<string> pp4;
	//p4 = p3;//使用unique_ptr时,所有权转让在编译期间发生报错,所以unique_ptr更安全

unique_ptr不允许非临时值转让所有权,但允许临时右值转让所有权,利用这一点,可以将unique_ptr作为函数返回值(因为返回值常常是一个临时变量)

//定义函数,
//unique_ptr的重要使用场景,将其作为函数返回值
unique_ptr<string> fun(const char* s) { 
	unique_ptr<string> temp(new string(s));
	return temp;
}
unique_ptr<int> make_int(int n) {
	return unique_ptr<int>(new int(n));
}

//在其他函数中可以通过如下方式使用
	unique_ptr<string> s = fun("abc");
	cout << *s << endl;
	
	unique_ptr<string> pp5;
	pp5 = unique_ptr<string>(new string("yyaya"));
	cout << *pp5 << endl;

shared_ptr

shared_ptr采用高智能的指针,跟踪引用特定对象的智能指针数(引用计数),赋值时,计数将加1,而指针过期时,计数将减1。仅当最后一个指针过期时,才调用delete

shared_ptr<string> films2[5] = {
		shared_ptr<string>(new string("dad")),
		shared_ptr<string>(new string("man")),
		shared_ptr<string>(new string("man")),
		shared_ptr<string>(new string("man")),
		shared_ptr<string>(new string("man")),
	};
	shared_ptr<string> pwin2;
	pwin2 = films2[2];
	//使用shared_ptr指针将不会有任何问题pwin2 和films2[2]这两个智能指针同时指向同一个内存
	for (int i = 0; i < 5; ++i)
		cout << *films2[i] << endl;
	cout << "pwin2指向的类容为:" << *pwin2 << endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值