C++11中的share_ptr智能指针:使用方法和优势详解

  shared_ptr是C++11中引入的一种智能指针,它可以用于管理动态分配的内存,并能够自动释放它所管理的资源。相较于unique_ptr,shared_ptr的所有权是共享的,多个shared_ptr可以指向同一块内存,当最后一个shared_ptr超出作用域或被删除时,它所管理的内存会被自动释放

shared_ptr的声明方式如下:

std::shared_ptr<DataType> ptr(new DataType);

其中,DataType是指向所分配内存的数据类型,new DataType用于分配内存并返回一个指向所分配内存的指针,这个指针被传递给shared_ptr构造函数进行初始化。

shared_ptr的主要用法如下:

目录

1、管理动态分配的内存

2、避免内存泄漏

3、共享所有权

4、使用自定义删除器


1、管理动态分配的内存

  shared_ptr可以管理动态分配的内存,当最后一个shared_ptr超出作用域或被删除时,它所管理的内存会被自动释放。以下是一个示例:

std::shared_ptr<int> ptr(new int(42));

2、避免内存泄漏

  由于shared_ptr的自动释放特性,它可以避免因忘记释放内存而导致的内存泄漏。以下是一个示例:

void function()
{
    std::shared_ptr<int> ptr(new int(42));
    // do something
    return; // ptr会自动释放内存
}

当函数结束时,最后一个shared_ptr对象会自动被销毁,并释放它所管理的内存。

3、共享所有权

  shared_ptr的所有权是共享的,因此多个shared_ptr可以指向同一块内存。这在多个对象需要共享同一块内存时非常方便。

 同时,share_ptr类型的指针支持赋值构造,以下是一个示例:

std::shared_ptr<int> ptr1(new int(42));
std::shared_ptr<int> ptr2 = ptr1;

  实现原理如下图所示:

 在share_ptr指针当中包含了两块数据,一个是数据元素指针,一个是引用计数对象控制块。可以看到share_ptr<int>ptr1(new int)的数据元素指针指向了一块新的内存空间,而控制块指针会指向一个堆当中的一个控制块的数据,刚开始创建时候引用计数为1。当ptr1指针赋值给同样类型的ptr2指针时,ptr1和ptr2都指向同一块内存,并共享它的所有权;ptr2指针中的控制块指针同样也指向堆当中的控制块数据,并且引用计数会加1。指针ptr1或者ptr2销毁时,引用计数会减1。当最后一个shared_ptr对象生命周期结束时,它所管理的内存会被自动释放。

4、使用自定义删除器

  shared_ptr也支持自定义删除器,可以在释放内存时执行自定义的清理操作。以下是一个示例:

void my_deleter(int* ptr)
{
    // do some clean-up
    delete ptr;
}

std::shared_ptr<int> ptr(new int(42), &my_deleter);

在这个例子中,我们定义了一个名为my_deleter的函数,它将在shared_ptr释放内存时被调用。在shared_ptr的构造函数中,我们将my_deleter指针传递给shared_ptr,以便在释放内存时执行清理操作。

  总之,shared_ptr通过自动管理内存和共享所有权等特性,可以帮助程序员更轻松地管理动态分配的内存,通过支持自定义删除器,也可以实现更灵活的内存管理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

达克豪斯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值