C++学习笔记(三)

智能指针

new在堆上分配内存,需要delete来释放内存。智能指针是实现这一过程自动化的一种方式,当你用new的时候不需要调用delete,很多时候用智能指针甚至不需要调用new。智能指针本质上是原始指针的包装,当你创建智能指针的时候,它会调用new并分配内存,然后在某一时刻这些内存会自动释放。

unique_ptr

unique_ptr是作用域指针,当超出作用域时它会被销毁然后delete。(低开销,甚至无开销)

#include <iostream>
#include <string>

#define LOG(X) std::cout << X << std::endl

class Entity
{
public:
	Entity()
	{
		LOG("Create Entity");
	}

	~Entity()
	{
		LOG("Destoryed Entity");
	}
};

int main()
{
	{
		//std::unique_ptr<Entity> entity(new Entity());
		std::unique_ptr<Entity> entity = std::make_unique<Entity>();//因为异常安全,所有用make_unique不用new
	}
}

注:不能复制,因为复制之后这些unique_ptr中的某一死掉之后,它们都会“死”

shared_ptr

shared_ptr的工作方式是通过引用计数,可以追踪指针有多少引用,一旦引用数为零它就被删除了。

shared_ptr需要分配一块内存叫做控制块,用来储存引用计数。如果先new一个对象,然后再把她(不要在意为什么是女字旁的她)传递给shared_ptr构造函数,它必须做两次内存分配,先做一次new的分配,然后再做一次shared_ptr的控制内存块的分配。如果用make_shared可以把它们组合在一起,这样更有效率。

#include <iostream>
#include <string>

#define LOG(X) std::cout << X << std::endl

class Entity
{
public:
	Entity()
	{
		LOG("Create Entity");
	}

	~Entity()
	{
		LOG("Destoryed Entity");
	}
};

int main()
{
	{
		std::shared_ptr<Entity> e0;
		{
			std::shared_ptr<Entity> sharedEntity = std::make_shared<Entity>();
			e0 = sharedEntity;
		}
	}

	std::cin.get();
}

这里引用数是2,当sharedEntity被销毁时并没有调用Entity类的析构函数,只有当e0被销毁时引用数变为1,才调用了析构函数。

weak_ptr

当把shared_ptr赋值给shared_ptr时会增加引用数,但把shared_ptr赋值给weak_ptr不会增加引用数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值