shared_ptr实现机制

一、概述

shared_ptr实现了引用计数的功能,在引用计数为0时,自动delete掉管理的对象。

二、实现要点
  • shared_ptr需要实现构造对象以及赋值时的计数。
  • shared_ptr需要实现自身销毁时的计数减少。
  • 需要实现计数为0时自动销毁管理的对象。
  • 需要实现std::move语义。
  • 要处理多线程下的计数问题。
三、shared_ptr的简单实现源码
#pragma once
#include <memory>
#include <atomic>
using namespace std;
template<class T> class MyRefCount
{
   
private:
	atomic<long> _uses; //atomic使用CPU级的控制,保证多个线程,一个在修改时,其他线程查看和修改回退。
	T* _ptr;
	//long weaks; 这个用来处理weak_ptr,本代码不做实现
	void destory()
	{
   
		delete _ptr; //计数为0后,调用实际对象的析构函数
	}
public:
	MyRefCount(T* ptr)
	{
   
		_ptr = ptr;
		_uses = 1;
	}
	void incRef()
	{
   
		_uses++;
		
	}

	void decRef()
	{
   
		_uses--;
		if (_uses == 0)
		{
   
			destory();
		}
	}
	long use_count()
	{
   
		return _uses;
	}
};
template<class T> class MySharedPtr
{
   
private:
	T* _ptr;
	MyRefCount<T
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::shared_ptr是C++中的智能指针,用于管理动态分配的内存。它通过引用计数的方式来跟踪有多少个shared_ptr共享同一个对象。当最后一个shared_ptr离开作用域或被显式地重置时,引用计数减少并且在没有其他shared_ptr引用该对象时,内存会被自动释放。 std::shared_ptr可以通过以下几种方式进行赋值: 1. 拷贝赋值:将一个shared_ptr赋值给另一个shared_ptr,这会增加引用计数。例如,foo = bar; 2. 移动赋值:使用std::move将一个unique_ptr转移到一个shared_ptr中,这会转移所有权并且不会增加引用计数。例如,foo = std::move(unique); 3. 使用std::make_shared创建shared_ptr:std::make_shared是一个模板函数,用于在堆上创建对象并返回一个shared_ptr。它可以接受任意数量的参数,并将它们传递给对象的构造函数。例如,std::shared_ptr<int> foo = std::make_shared<int>(10); 使用shared_ptr可以避免内存泄漏和悬空指针的问题,因为它会自动管理内存的释放。同时,shared_ptr还提供了其他成员函数,如get()用于获取指向对象的原始指针,use_count()用于获取当前引用计数的值等。 总结起来,std::shared_ptr是一种智能指针,用于管理动态分配的内存。它可以通过拷贝赋值、移动赋值和std::make_shared等方式进行赋值。它的引用计数机制可以确保内存的正确释放。 #### 引用[.reference_title] - *1* *2* [std::shared_ptr 详解](https://blog.csdn.net/baidu_31541363/article/details/95802210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [shared_ptr代码实现](https://blog.csdn.net/weixin_43246170/article/details/121339985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值