c语言实现智能指针,C++智能指针学习

C++智能指针学习

[toc]

智能指针内存管理要解决的根本问题是:一个堆对象,在被多个对象引用时,如何释放资源的问题。

shared_ptr

shared_ptr智能指针内存管理的思路

shared_ptr智能指针的解决思路:最后一个引用它的对象被释放时,释放这段内存。

实现方法:对 被管理的资源 进行计数。当一个sharedptr对象要共享这个资源的时候,该资源的引用计数加1,当该对象生命周期结束了,再把该引用计数减1。这样,当最后一个引用它的对象被释放的时候,资源的引用计数减少到0,此时释放该资源。

智能指针的使用

智能指针的内部实现

智能指针最终的实现是 两个指针成员:一个指向数据成员,一个指向计数器成员

智能指针里的计数器 维护的是一个指针,指向的 实际内存 在堆上,不是栈上的

智能指针拷贝构造的原理

11389ccbcf79

image.png

reset

reset的功能是:释放对象,默认情况下置空指针。能够被安全地多次调用。

p.reset()

p.reset(q)

p.reset(q, d)

如果p是唯一指向其对象的shard_ptr, reset会释放对象。

如果传递了可选参数内指针q,则会令p指向p;

否则将p置空。

如果还传递了参数d,则将会调用d而不是delete来释放q。

释放q的时机不是发生在reset时,而是q在运行到需要释放的时候。这里说明的是 reset会传递给它一个单独的delete函数

智能指针赋值nullptr

表现和reset的行为一致,会递减对象的计数器,如果减为0,则调用析构,释放对象。

class C {

public:

~C() {

cout << "C dtor" << endl;

}

};

using namespace cycle_ref;

shared_ptr<:c> sp(new cycle_ref::C());

sp = nullptr;

cout << "before exit" << endl;

运行结果:在赋值nullptr时,调用了析构。

C dtor

before exit

weak_ptr

概念

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值