首页 > 其他分享 >9.手写实现智能指针类需要实现哪些函数?

9.手写实现智能指针类需要实现哪些函数?

时间:2023-08-02 22:23:27浏览次数:46  
标签:count SharedPtr 实现 智能 手写 指针 ptr 构造函数

9.手写实现智能指针类需要实现哪些函数?

1.智能指针是一个数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的引用计数为0,就释放该对象。

除了指针对象外,我们还需要一个引用计数的指针设定对象的值,并将引用计数计为1,需要一个构造函数。新增对象还需要一个构造函数,析构函数负责引用计数减少和释放内存。

通过覆写赋值运算符,才能将一个旧的智能指针赋值给另一个指针,同时旧的引用计数减1,新的引用计数加1

2.手写实现一个简单的智能指针类,通常需要实现以下几个主要函数:

构造函数:至少需要一个构造函数,用于初始化智能指针并管理指向的原始指针。可以有不同的构造函数,用于从不同类型的指针或其他智能指针进行初始化。

析构函数:析构函数是智能指针的关键部分,它负责在适当的时候释放管理的原始指针资源,防止内存泄漏。

拷贝构造函数:如果希望智能指针支持拷贝语义,需要实现拷贝构造函数。拷贝构造函数会创建一个新的智能指针,该指针与另一个智能指针共享同一个原始指针。

移动构造函数:如果希望智能指针支持移动语义,需要实现移动构造函数。移动构造函数会转移原始指针的所有权,使得源指针不再拥有资源,而目标指针接管资源的管理。

拷贝赋值运算符:如果希望智能指针支持拷贝赋值操作(例如 ptr1 = ptr2;),需要实现拷贝赋值运算符。这样可以确保两个智能指针共享同一个资源。

移动赋值运算符:如果希望智能指针支持移动赋值操作(例如 ptr1 = std::move(ptr2);),需要实现移动赋值运算符。这样可以在转移资源所有权时避免重复释放。

解引用操作符:实现解引用操作符(operator*operator->)以允许智能指针像原始指针一样使用。

布尔转换操作符:为了能够在条件语句中使用智能指针,可以实现布尔转换操作符(operator bool()explicit operator bool())。

重载其他运算符(可选):还可以根据需要重载其他运算符,以使智能指针更灵活地适应不同的场景。

此外,可能还需要考虑其他细节,比如异常安全性、空指针处理等。编写高质量的智能指针类需要小心处理资源管理和多线程问题,确保它们正确、高效地管理内存,并在适当的时候释放资源。建议在实现智能指针类时使用现代C++特性,如移动语义和RAII(资源获取即初始化)原则,以简化代码并提高效率。

3.实例

手写实现一个简单的shared_ptr类需要涉及一些复杂的概念,包括动态内存分配、析构函数、拷贝构造函数、拷贝赋值运算符和移动语义。以下是一个简单版本的shared_ptr

template<typename T>
class SharedPtr 
{
public:
    SharedPtr(T* ptr = nullptr) : ptr_(ptr), count_(ptr ? new int(1) : nullptr) {}

    ~SharedPtr() 
    {
        if (ptr_ && (--(*count_) == 0)) 
        {
            delete ptr_;
            delete count_;
        }
    }

    SharedPtr(const SharedPtr& sp) : ptr_(sp.ptr_), count_(sp.count_) 
    {
        if (ptr_) ++(*count_);
    }

    SharedPtr& operator=(const SharedPtr& sp)
    {
        if (this != &sp)
        {
            if (ptr_ && (--(*count_) == 0))
            {
                delete ptr_;
                delete count_;
            }
            ptr_ = sp.ptr_;
            count_ = sp.count_;
            if (ptr_) ++(*count_);
        }
        return *this;
    }

    T& operator*() const 
    {
        return *ptr_;
    }

    T* operator->() const
    {
        return ptr_;
    }

    int use_count() const 
    {
        return ptr_ ? *count_ : 0;
    }

private:
    T* ptr_;
    int* count_;  // 记录共享资源的引用计数
};

在这个例子中,我们的SharedPtr类模拟了std::shared_ptr的基本功能:它包含一个原始指针和一个引用计数器。构造函数初始化这两个成员,并适当地设置引用计数。析构函数在适当的时候删除原始指针并重置引用计数。拷贝构造函数和拷贝赋值运算符实现了SharedPtr对象之间的深拷贝,同时更新引用计数。

请注意,这个示例的SharedPtr是非常简化的,它没有处理异常、线程安全等问题,也没有实现自定义删除器、数组、与std::weak_ptr的互动等高级功能。在实际使用中,应优先使用标准库的智能指针,如std::shared_ptr,因为它们已经处理了这些复杂的问题,并且经过了严格的测试和优化。

标签:count,SharedPtr,实现,智能,手写,指针,ptr,构造函数
From: https://www.cnblogs.com/codemagiciant/p/17601936.html

相关文章

  • 8.智能指针的循环引用
    8.智能指针的循环引用循环引用是指使用多个智能指针share_ptr时,出现了指针之间相互指向,从而形成环的情况,有点类似于死锁的情况,这种情况下,智能指针往往不能正常调用对象的析构函数,从而造成内存泄漏。举个例子:#include<iostream>usingnamespacestd;template<typenameT>cl......
  • 3.使用智能指针管理内存资源,RAII是怎么回事?
    3.使用智能指针管理内存资源,RAII是怎么回事?什么是RAII?RAII是ResourceAcquisitionIsInitialization(wiki上面翻译成“资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时......
  • canvas实现视频播放并支持自动播放
    背景:在工作中很多时候会遇到大屏首页需要酷炫的动态背景,很多时候酷炫的动效用css和js比较难于实现。此时就会产生两种方案,第一种是采用gif,第二种会采用video方案。但是第一种方案有时候导出的gif图片往往会比较大,在首屏加载有时候会不太理想,资源比较大在加载时会出现一卡一卡......
  • 6.关于this指针你知道什么?全说出来
    6.类的*this指针有以下特点1.每个对象都有一个隐藏的this指针,但不属于对象,是编译器添加的2.this只能在成员函数中使用。全局函数、静态函数都不能使用this。实际上,成员函数默认第一个参数为T*constthis。如:classA{public: intfunc(intp) { }};其中,func的原型在......
  • 3.什么是内存池,如何实现
    3.什么是内存池,如何实现内存池(MemoryPool)是一种内存分配方式。通常我们习惯直接使用new、malloc等申请内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情......
  • jvm attach过程与底层实现
    rasp的技术重点之一是java-agent技术,通过agent可以获取到Instrumentation接口的实现,通过这个inst变量对字节码进行修改。javaagent可以在jvm启动时使用-agentjar参数启动,也可以在运行时通过attach相应进程,并且指明需要加载的jar包,就可以进入到jar包中定义好的agentmain方法处,执......
  • 128.用C语言实现C++的继承
    128.用C语言实现C++的继承#include<iostream>usingnamespacestd;//C++中的继承与多态structA{virtualvoidfun()//C++中的多态:通过虚函数实现{cout<<"A:fun()"<<endl;}inta;};structB:publicA//C++中的继承:B类公有继......
  • 基于蜉蝣优化算法实现聚类附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 公共字段自动填充_问题分析和实现思路
       ......
  • 采用PCA算法&KMeans算法来实现用户对物品类别的喜好细分(菜篮子分析)(附带数据集下载)
    实现该项目的流程如下"""项目:用户对物品类别的喜好细分(菜篮子分析)主算法:PCA降维算法KMeans算法总思路1、导包2、获取数据3、数据处理5、特征工程(使用PCA降维)6、使用KMeans算法进行模型训练7、模型评估""" Firstofall!!导包......