C++智能指针学习
[toc]
智能指针内存管理要解决的根本问题是:一个堆对象,在被多个对象引用时,如何释放资源的问题。
shared_ptr
shared_ptr智能指针内存管理的思路
shared_ptr智能指针的解决思路:最后一个引用它的对象被释放时,释放这段内存。
实现方法:对 被管理的资源 进行计数。当一个sharedptr对象要共享这个资源的时候,该资源的引用计数加1,当该对象生命周期结束了,再把该引用计数减1。这样,当最后一个引用它的对象被释放的时候,资源的引用计数减少到0,此时释放该资源。
智能指针的使用
智能指针的内部实现
智能指针最终的实现是 两个指针成员:一个指向数据成员,一个指向计数器成员
智能指针里的计数器 维护的是一个指针,指向的 实际内存 在堆上,不是栈上的
智能指针拷贝构造的原理
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
概念