auto sp = std::make_shared<int>();
auto sz = sizeof(sp); // 2个指针的大小
看了下libcxx的实现,是在std::shared_ptr
内部存了两个指针,一个指向原始指针,一个指向control block
,同时control block
又保存一个原始指针,std::shared_ptr
保存的原始指针只在std::shared_ptr::get()
用到,实际上std::shared_ptr::get()
里面也可以从control block
里面把真正的原始指针拿出来强转回去吧,类似下面这样:
template<typename T>
class shared_ptr<T> {
T *ptr_;
shared_weak_count *cntrl_;
};
template<typename T>
T *std::shared_ptr<T>::get() {
return (T*)cntrl_->ptr_;
}
为什么不直接全部保存到control block
中。
shared_ptr
的构造函数里有这样一个重载(aliasing constructor):这会让两个不同类型的
shared_ptr
共享同一个control block。如果只在control block里存一个指针,那这就无法实现了。并且如果不在control block里存指针,那么用到aliasing constructor的情景在析构的时候会出问题。
所以需要两个指针。