智能 指针

详情:(299条消息) C++ 智能指针 - 全部用法详解_cpp_learners的博客-CSDN博客

一.智能指针的引用 

看以下代码

如果p->foo()代码出现异常,那么就会停止在这一步,这样的话未能执行delete p便会出现内存泄漏(内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。最终的结果就是导致OOM。内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序)

void some_func(){
    Object*p = new Object;
    p->foo();
    delete p;
}

二.auto_ptr(智能指针)

 

二.shared_ptr(共享指针)

shared_ptr一块内存资源不再使用时,shared_ptr会自动帮你释放
shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。

1.初始化

shared_ptr<int> p1 = make_shared<int>();				//p1指向一个值初始化的即为int
cout << *p1 << endl;											//指针解引用,当为()时默认输出为0
cout << p1.use_count() << endl;							//返回与p共享对象的智能指针数量,输出为1

shared_ptr<string>p2 = make_shared<string>(10, '9');	//p4指向一个值初始化为string的
cout << *p2 << endl;											//输出为9999999999

2.共享操作

当进行拷贝或赋值操作,每个shared_ptr会记录有多少个其他shared_ptr指向相同的对象

auto p = make_shared<int>(43);							//p指向的对象只有p一个引用者
auto q(p);												//p和q指向相同对象,此时有两个

auto r = make_shared<int>(42);
r = q;
cout << p.use_count();									//输出为3

3.show the code

class Ball {
public:
	Ball() {
		cout << "A ball appears." << endl;
	}

	~Ball() {
		cout << "A ball disaappears." << endl;
	}
	void Bounce() {
		cout << "A ball jumps." << endl;
	}
};

int main() {

	shared_ptr<Ball> p = make_shared<Ball>();
	cout << p.use_count() << endl;												//输出为1
	shared_ptr<Ball> p2 = p;
	cout << p.use_count() << " " << p2.use_count() << endl;						//输出为2,2
	shared_ptr<Ball> p3 = p;
	cout << p.use_count() << " " << p2.use_count() << " " << p3.use_count();	//输出为3,3,3


	return 0;
}

三.unique_ptr

unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)

class Ball {
public:
	Ball() {cout << "A ball appears." << endl;}
	~Ball() {cout << "A ball disaappears." << endl;}
	void Bounce() {cout << "A ball jumps." << endl;}
};

void func() {
	cout << "Now in func" << endl;
	unique_ptr<Ball> up = make_unique<Ball>();
	up->Bounce();
	cout << "Before quiting func" << endl;
}

int main() {
	cout << "Now in main." << endl;
	func();
	cout << "End Executing func." << endl;
	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未央吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值