动态内存管理和智能指针 2.0 -- shared_ptr

shared_ptr的详解 参考:《C++ primer 第五版》                https://www.cnblogs.com/boydfd/p/5146432.html (需要多看几遍)前言程序中常用的存储形式如下。静态内存:static对象,类static的数据成员,函数外的变量。栈内存:函数内的非static对象。自由空间或堆:动态分配的对象,程序控制生命周期。动态内存与智能指针从前,我们使用运算符n... 阅读详情

shared_ptr出现原因

通过第一章的学习,我们知道不管是auto_ptr合适scoped_ptr都是存在缺陷的,于是我们必须想出一个方法既能很好的管理我们的内存,而且在使用的时候,可以多个指针指向一个内存,这个时候就出现了shared_ptr。

shared_ptr的实现原理

shared_ptr使用的引用计数的浅拷贝的形式,这个时候是不需要使用引用计数的写时拷贝的,因为多个指针指向的是同一个动态的内存空间,当其中的一个内存空间改变的时候,其他的内容也是相应的改变的。
这个时候我们的shared_ptr这个类的成员变量中就要有一个指针,用于指向一个动态开辟的存储空间,还需要有一个用于计数的指针,这个指针指向一个动态开辟的内存空间,一般是整型的,这个整型 变量中存放的是我们指向同一个空间的个数,然后这个动态的整型空间只在构造函数的使用开辟出来,其他的拷贝构造函数还有赋值运算符的重载 的时候直接的使用了。

简单代码实现

template<class T>
class Shared_Ptr
{
public:
    Shared_Ptr(T* ptr)
        :_ptr(ptr)
        ,_count(new int(1))
    {
    }

    Shared_Ptr(const Shared_Ptr& ptr)
        :_ptr(ptr._ptr)
        , _count(ptr._count)
    {
        (*_count)++;
    }
    Shared_Ptr& operator=(const Shared_Ptr& ptr)
    {
        if (this == &ptr)
        {
            return *this;
        }

        else
        {
            if (!--(*_count))
            {
                delete _ptr;
                delete _count;
                cout << "delete older" << endl;
            }
            _ptr = ptr._ptr;
            _count = ptr._count;
            (*_count)++;
        }
        return *this;
    }

    ~Shared_Ptr()
    {
        (*_count)--;
        if ((*_count) == 0)
        {
            delete _ptr;
            delete _count;
            cout << "delete" << endl;
        }
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }


private:
    T* _ptr;
    int* _count;
};

代码分析

构造函数
当我们使用构造函数的时候,这个时候肯定是已经动态开辟了一个内存空间的,所以我们这个时候也给我们_count指针动态的开辟一个空间,并且这个空间的值是1,因为此时一定是有一个空间了。

拷贝构造函数
拷贝构造函数的时候,我们是让一个已经存在的对象去初始化另一个对象,所以这个时候我们只需要让当前对象的指针指向那个动态的空间,同时时当前对象的计数指针也指向那个对象的计数空间,并且使当前对象的计数值加1,因为这个时候已经有两个对象 指向了一个动态的空间了。

析构函数
析构函数的时候,我们需要把引用计数减一,这个时候再去判断我们的引用计数的值是否为0,如果是0,这个时候就需要释放我们的动态管理的空间,同时释放掉我们的引用计数的动态空间,同时需要把这两个指针置为NULL。

赋值运算符的重载

该检查的是,这个赋值是不是自赋值,如果是 自赋值,这个时候直接返回该对象 即可了,还需要注意的是,我们 的引用计数不需要加1.如果不是自赋值,此时需要把当前对象的引用计数减1,同时判断减1之后应用计数是不是为0,如果是0则需要释放掉,如果不是0,就不要管了,然后接下来把我们当前指针指向被赋值的那个空间即可。

循环引用和weak_ptr

当下面的代码的时候会出现一种情况就是 循环引用,首先看代码,下面的代码是我们定义的一个结构体

struct Str
{
    Shared_Ptr<Str> _prev;
    Shared_Ptr<Str> _next;
};

再来看我们的构造函数

Shared_Ptr(T* ptr)
        :_ptr(ptr)
        ,_count(new int(1))
    {
    }

上面的构造函数中,我们的构造函数没有缺省值,会报错,因为我们在定义_prev和_next的时候,没有传入参数,所以我们需要把我们的构造函数改成下面的样子,就是把缺省值赋值为NULL。
这个时候我们写一个测试用例

Shared_Ptr<Str> a = new Str;
Shared_Ptr<Str> b = new Str;

这个时候会打印出六个delete,因为我们new出来的两个对象本身是有两个对象的,所以析构的时候,会析构这里面的两个一个是_next一个是_prev,然后我们的a和b本身也是指向对象的,所以一共析构了六次。

隐患问题 – 循环引用

如果我们是像下面的方式 使用它,就会出现循环 引用的问题,请看下面的代码


    Shared_Ptr<Str> a = new Str;
    Shared_Ptr<Str> b = new Str;


    a->_next = b;
    b->_prev = a;

结合刚刚的分析,我们来分析上面的一段程序,首先是a和b分别指向了两个new出来的对象 ,然后这两个对象 里面的next和prev分别指向了两个对象,接着 执行a->_next = b;
b->_prev = a;的时候,会调用赋值运算符的重载,然后就是a里面的next由原来的内容指向了b,b里面 的prev由原来的内容指向了a;这个时候问题就来了,b这个指向指向的内存空间有两个指针指向着,一个是b自己,一个是a->_next,所以析构的时候不会释放内存空间,这不是我们想看到的结果。也可以这样子分析,就是我们的a和b析构的时候,只是 把引用计数减1,接下来析构a->_next和b->prev的时候,都是相互依赖彼此的,所以都释放不了,这就是循环引用。

weak_ptr

于是为了解决上面的循环引用的特殊场景,配合着shared_ptr设计出了一个weak_ptr,代码如下

#include<iostream>
using namespace std;

template<class T>
class Weak_ptr;

template<class T>
class Shared_Ptr
{

public:
    friend class Weak_ptr<T>;
    Shared_Ptr(T* ptr = NULL)
        :_ptr(ptr)
        ,_count(new int(1))
    {
    }

    Shared_Ptr(const Shared_Ptr& ptr)
        :_ptr(ptr._ptr)
        , _count(ptr._count)
    {
        (*_count)++;
    }

    Shared_Ptr& operator=(Shared_Ptr& ptr)
    {
        if (this == &ptr)
        {
            return *this;
        }

        else
        {
            if (!--(*_count))
            {
                delete _ptr;
                delete _count;
                cout << "delete older" << endl;
            }
            _ptr = ptr._ptr;
            _count = ptr._count;
            (*_count)++;
        }
        return *this;
    }

    ~Shared_Ptr()
    {
        (*_count)--;
        if ((*_count) == 0)
        {
            delete _ptr;
            delete _count;
            _ptr = NULL;
            _count = NULL;
            cout << "delete" << endl;
        }
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }


protected:
    T* _ptr;
    int* _count;
};

template<class T>
class Weak_ptr
{
public:
    Weak_ptr()
        :_ptr(NULL)
    {}
    Weak_ptr(Shared_Ptr<T> ptr)
    {
        _ptr = ptr._ptr;
    }
    T* operator->()
    {
        return _ptr;
    }

private:
    T* _ptr;
};


struct Str
{
    Weak_ptr<Str> _prev;
    Weak_ptr<Str> _next;
    int _a;
};


void TestPtr()
{


    Shared_Ptr<Str> a = new Str;
    Shared_Ptr<Str> b = new Str;

    a->_next = b;
    b->_prev = a;
    a->_next->_a = 0;
    cout << b->_a;

}

首先我们看Weak_ptr,它的成员变量是T* _ptr;此时我们的Str那个自定义的结构体中的指针就可以改成了Weak_ptr的形式,因为我们的Weak_ptr维护的是一个普通的指针,但是我们在使用的时候需要用到_next指向一个Shared_ptr的对象,所以这个时候,我们不要把Weak_ptr的拷贝构造函数的参数写成是Shared_ptr,然后赋值的时候,需要把Shared_ptr的_ptr赋值给Weak_ptr的_ptr,但是Shared_ptr中的_ptr是 私有的,所以这个时候我们在Shared_ptr里面把Weak_ptr声明为友元。但是这个时候又出现了一个 问题就是,我们的他声明为友元之后,编译器找不到我们的友元类,因为我们的Weak_ptr的定义部分是在Shared_ptr的后面,所以这个时候,需要在Shared_ptr的前面声明我们的Weak_ptr。

定制防函数

所谓的防函数就是让我们的类看起来像是函数一样
举一个简单的例子,看下面的代码

struct Compare
{
    bool operator()(int a,int b)
    {
        return a > b;
    }
};

void test()
{
    Compare com;
    cout << com(1,2);
}

类Compare是我们定制的一个防函数,下面的test就是我们把他 当成一个函数来使用它

为什么要引入防函数呢,因为我们在使用的时候上面的Shared_ptr的时候,我们管理的内存 空间可能是一个FILE*的一个指针,这个时候我们就不能只使用delete来释放我们的空间,这个时候我们就需要定制一个防函数,把它作为一个参数放在构造函数 中,同时我们的Shared_ptr的成员变量里面需要定义一个这样的变量。

请看下面的代码


#include<iostream>
using namespace std;
#include<assert.h>
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1



struct DelFile
{
    void operator()(FILE* f)
    {
        fclose(f);
        cout << "fclose" << endl;
    }
};


struct DelDel
{
    void operator()(void* p)
    {
        assert(p);
        delete p;
        cout << "delete" << endl;
    }
};

template<class T,class Del>
class Weak_ptr;

template<class T,class Del>
class Shared_Ptr
{

public:
    friend class Weak_ptr<T,Del>;
    Shared_Ptr(T* ptr,Del d)
        :_ptr(ptr)
        ,_count(new int(1))
        , _del(d)
    {
    }

    Shared_Ptr(const Shared_Ptr& ptr)
        :_ptr(ptr._ptr)
        , _count(ptr._count)
    {
        (*_count)++;
    }

    Shared_Ptr& operator=(Shared_Ptr& ptr)
    {
        if (this == &ptr)
        {
            return *this;
        }

        else
        {
            if (!--(*_count))
            {
                del(_ptr);
                delete _count;
                cout << "delete older" << endl;
            }
            _ptr = ptr._ptr;
            _count = ptr._count;
            (*_count)++;
        }
        return *this;
    }

    ~Shared_Ptr()
    {
        (*_count)--;
        if ((*_count) == 0)
        {
            _del(_ptr);
            delete _count;
            _ptr = NULL;
            _count = NULL;
            //cout << "delete" << endl;
        }
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }


protected:
    T* _ptr;
    int* _count;
    Del _del;
};

template<class T, class Del>
class Weak_ptr
{
public:
    Weak_ptr()
        :_ptr(NULL)
    {}
    Weak_ptr(Shared_Ptr<T,Del> ptr)
    {
        _ptr = ptr._ptr;
    }
    T* operator->()
    {
        return _ptr;
    }

private:
    T* _ptr;
};


struct Str
{
    Weak_ptr<Str,DelDel> _prev;
    Weak_ptr<Str, DelDel> _next;
    int _a;
};

void TestFile()
{
    DelFile d;
    Shared_Ptr<FILE, DelFile> a(fopen("w.ss","w"),d);   //注意这里传参的时候,首先要实例化一个对象
            //我一开始使用的是Shared_Ptr<FILE, DelFile> a(fopen("w.ss","w"),DelFile d)
            //这种方式显然是错误的,我不能在一个函数里面去实例化一个对象
}


void TestPtr()
{
    DelDel d;
    Shared_Ptr<Str, DelDel> a(new Str, d);
    Shared_Ptr<Str, DelDel> b(new Str, d);

    a->_next = b;
    b->_prev = a;
    a->_next->_a = 0;
    cout << b->_a;



}

struct Compare
{
    bool operator()(int a,int b)
    {
        return a > b;
    }
};

void test()
{
    Compare com;
    cout << com(1,2);
}




C++11智能指针(unique_ptr、shared_ptr、weak_ptr) 更多文章欢迎访问 程序员小非 博客 很多人怕写C/C++ 程序就是因为指针,因为指针给了程序员高度的自由,同样也赋予了高度的责任,稍有不慎就导致内存泄漏。其实写C++ 可以完全不用指针,尤其C++ 11对智能指针作了进一步的升级,在不需要使用任何裸指针的前提下也可以写出高效的C++ 程序。C++ 11中定义了unique_ptr、shared_ptr与weak_ptr三种智能指针(smart ... 阅读详情

相关推荐

浅谈auto_ptr智能指针

在c++标准库里主要有三个智能指针: ①auto_ptr 在任何情况下都不要使用 ②scoped_ptr 独占空间,防拷贝和赋值,是对第①个智能指针的缺陷所作出的解决 ③shared_ptr 利用引用计数,和其他对象共享一块空间(与weak_ptr结合使用) 这篇文章主要的内容是讲解auto_ptr所引出的一系列问题: 一、AutoPtr智能指针

小葱的博客 1万+

关于shared_ptr的释放

如果在某个类(如classA)中定义了智能指针shared_ptr,并且该指针指向了某对象资源,则该对象的释放工作将在classA的析构函数调用后自动进行,其实就是在销毁智能指针对象时销毁其指向的引用数为0的资源。调用shared_ptr的reset是不能释放所指资源的。 shared_ptr有显式办法控制何时销毁自己和所指资源吗?

bodybo的专栏 1万+

C++11 新特性 ⑥ | 智能指针 unique_ptr、shared_ptr 和 weak_ptr

详细讲解C++11中的智能指针 unique_ptr、shared_ptr 和 weak_ptr。

dvlinker的技术专栏 2万+

智能指针shared_ptr

auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。boost库中提供了一种新型的智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。 当出现以下情况时应该优先考虑使用sh

Sean 853

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记-----GCN在交通领域的应用(二) 一、论文翻译: 1、摘要: 及时准确地交通预测对于城市交通控制和指导具有至关重要的意义。由于交通流量的非线性和复杂性,传统的方法不能满足中长期预测任务的需求,并且往往会忽略时空数据的时间和空间依赖特性。在这篇论文中,为了处理在交通领域的时间序列预测问题...

cy_believ的博客 1916

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1786

share_ptr使用

内存管理之share_ptr引子初始化 sahred_ptr关于get()函数关于make_shared函数:shared_ptr的拷贝和赋值容器中的shared_ptr-记得用erease节省内存状态共享——why use shared_ptr?智能指针与异常1)管理动态数组2)管理非常规动态对象总结: 本文转载自:内存管理之Share_Ptr 引子 C++中动态内存的管理是通过new和dele...

sinat_39628214的博客 3982

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 520

C++(标准库):04---智能指针之shared_ptr

一、shared_ptr类 头文件:#include<memory> 智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型 如果当做提条件判断,则是检测其是否为空 shared_ptr<string> p1; //指向string shared_ptr<list<int>> p2;//指向int的list if(p1 &...

董哥的黑板报 2240

FLUENT UDF编译及蒸发冷凝相关问题

蒸发冷凝与相间传质

weixin_48029137的博客 1万+

微软登录OAuth 2.0授权流程

OAuth 2.0是一个关于授权的开放网络标准,它允许第三方应用获取用户数据,是目前最流行的授权机制。微软身份平台支持OAuth 2.0授权码流程,使得客户端应用程序能够获得对受保护资源(如网络API)的授权访问。这一流程在保障用户数据安全的前提下,实现了应用的便捷登录与数据共享。当用户在一个支持OAuth 2.0的应用上,希望使用微软账号进行登录时,OAuth 2.0授权流程即被触发。

qq_36569837的博客 4086

C++11中shared_ptr的使用

C++11中shared_ptr的使用

网络资源是无限的 8万+

【网络教程】Ubuntu有线连接消失,无法联网怎么办!(亲测有效!)

文章目录问题描述解决方案 问题描述 今天打开Ubuntu,突然发现无法连接网络,并且打开设置,发现设置里面的网络已经没有了有线连接,只有VPN设置选项,如图 解决方案 按照下列的代码执行即可! # 关闭网路 service NetworkManager stop # 删除NetworkManager缓存文件 sudo rm /var/lib/NetworkManager/NetworkManager.state # 打开网络 service NetworkManager start 运行完

XiaoqiangClub的博客 1万+

C++智能指针详解:shared_ptr

C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。 使用 raw pointer 管理动态内存时,经常会遇到这样的问题: 忘记delete内存,造成内存泄露。 出现异常时,不会执行delete,造成内存泄露。 下面的代码解释了,当一个操作发生异常时,会导致delete不会被执行: void func() { auto ptr = new Widget;

feikudai8460的博客 1万+

【ARM Trace32(劳特巴赫) 使用介绍 1.3 - ARM 系统调试中常见的挑战】

每一个独立的gust os或者一个OS 内部里面美格独立的进程它使用虚拟地址是可能是重叠的,比如linux中每个用户进程它的运行地址(虚拟地址)都是0x0,这时如果想去同时调试所有进程,那么必须要有个办法把这些进程区分开来,trace32 就在虚拟地址前面加前缀的方法,这个前缀称为space id, 这个space id 实际上就是processor id或者是task id, 这样就可以把一个os内部的不同的进程区分开来。如果工具和内核中的连接是可以建立起来的,那么接下来就是调试工具使用的问题了。

CodingCos的博客 1961

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.3 从零移植 busybox,基于RISC-V

上一章节我们已经成功启动了`Ubuntu`,但是由于`Ubuntu`占用系统空间过大,所以我转向占用较小的`busybox`,预计就占用`30M`左右。开始移植busybox,基于riscv64

DSMGUOGUO的博客 856

从C语言到C++你必须学会的---动态内存和智能指针

不管你是C++初学者,还是想从C语言转变为C++,你都应该了解C++的动态内存和智能指针,今天我们就来看一下有关这两个方面的内容。 本文章内容篇幅较长,且干货满满,感兴趣的大家可以收藏+点赞,以后慢慢看!

KOOKNUT的博客 5365

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

详解c++动态内存new/delete、智能指针shared_ptr、unique_ptr、weak_ptr

可编程内存基本上可分为以后三个大部分静态存储区、栈区、堆区简介。 传统内存管理new和delete、分配智能指针shared_ptr、unique_ptr、weak_ptr的使用实例,以及他们彼此的联系和区别。 简单介绍Allocate使用。

热爱生活,忠于自己 5637

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++智能指针1——shared_ptr类

在C++中,动态内存的管理是通过一对运算符来完成的:动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极其困难的。有时我们会忘记释放内存,在这种情况下就会产生内存泄漏;有时在尚有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。为了更容易(同时也更安全)地使用动态内存,新的标准库提供了两种智能指针类型来管理动态对象。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。新标准库提供的这两种智能指针的区别在于管理底层指针的方式这三种类型都定义在memory头文件

2301_80224556的博客 1227

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++智能指针 shared_ptr,unique_ptr和weak_ptr

1.智能指针为什么存在?因为C++没有自动回收内存的机制,因此每一次new出来的动态内存必须手动delete回去。因此智能指针可以解决这个问题。2.智能指针的大致描述是什么?智能指针:自动负责释放所指向的对象,实际上它利用了栈的机制,每一个智能指针都是一个模板类,调用智能指针实际上是创建了一个智能指针的对象,对象生命周期到达尽头的时候,会自动调用智能指针的析构函数,在析构函数里,释放掉它管理的内存,

zhuziyu1157817544 1万+

【C++】动态内存(一):动态内存与智能指针——shared_ptr类

对 C++ Primer 第五版第十二章第一节的动态内存与智能指针——shared_ptr 类进行阅读、学习和记录。

YGGP的博客 900

C++智能指针之shared_ptr

在C++中,动态内存的申请和释放是通过运算符:new 和 delete 进行管理的。其中 new 负责申请内存,delete负责释放内存。动态内存的使用很容易出现问题,这主要在于你需要保证在正确的时间释放内存,这是比较困难的,如果你忘记释放内存,就会造成内存泄露;有时在还有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。

CltCj的博客 7908

智能指针三剑客:shared_ptr

在c++中,进行动态内存的分配通常使用new和delete操作符。我们在学习这一对运算符时,一定都听过要注意在使用完new分配到内存后,一定要使用delete手动释放内存,否则就会造成内存的泄露。智能指针就是用来避免这种情况的,智能指针实际上是一个类,它的使用类似于常规指针,但增加了自动内存管理的功能。它会自动删除其所指向的对象,防止内存泄露。而且,当在异常处理中使用动态分配到内存时,智能指针可以确保内存得到正确释放,即使在异常抛出时也是如此。

2301_78933228的博客 2057

C++智能指针shared_ptr、unique_ptr以及weak_ptr

使用智能指针的目的:为了更容易更安全的使用动态内存 智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。 新标准库提供的两个智能指针shared_ptr和unique_ptr的区别在于管理底层指针的方式: shared_ptr允许多个指针指向同一个对象 unique_ptr则“独占”所指向的对象 weak_ptr则是一种弱引用,指向shared_ptr所管理的对象 shared_ptr类 智能指针也是模板,所以在创建一个智能指针时,必须提供指针指向的类型: shared...

DayDayUp 6232

智能指针shared_ptr,unique_ptr,weak_ptr

在C++中,动态内存的管理是通过一对运算符来完成的: new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化: delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。为了更容易(同时也更安全)地使用动态内存,新的标准库提供了两种智能指针(smapointer)类型来管理动态对象。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。新标准库提供的这两种智能指针的区别在于管理底层指针的方式:shared ptr允许多个指针指向同一个对象;

a45467911的博客 913

动态内存管理 智能指针 shared_ptr、unique_ptr、weak_ptr + 定制删除器

指程序使用系统分配的资源,比如套接字,文件描述符,管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。C++智能指针之shared_Ptr的原理以及简单实现_shared ptr-优快云博客。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。2.这块内存还有其他指针指向的情况下,就释放了它,会产生引用非法内存的指针,例如。auto_ptr的问题:当对象拷贝或者赋值后,前面的对象就悬空了。的,所以在实现的过程中也。

呵呵哒!的博客 1055
上一篇: 简易git操作 -- 让你的格子绿起来
下一篇: 计算机网络基础 1.0 -- 概述
NeilZhy
博客等级 码龄11年 175粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值