瞎看了一点博客自认为搞懂,现在没什么时间写代码,写简单记下来。
shared_ptr的是一种“引用计数型智慧指针”(RCSP),它最核心的本质在于引用计数。
并且这个引用计数器也是一个类指针。
除开这个引用计数器以外,自然还有本重要的指针了,除此之外就没有其他的成员变量。
shared_ptr与uniqe_ptr的重要区别在于,unique_ptr只能指向一个对象,这是由它的析构函数决定的,因为析构函数必定会释放掉指针所指的内存,如果指向多个,将会多次释放,引起错误。
因此,unique_ptr的构造是不允许nullptr的。
与此相对,shared_ptr却可以,而且他默认构造就是指向nullptr,在真正构造非空对象的时候,才会将两个指针用上。
并且在赋值等操作引起计数器变为 0 的时候会立刻delete,而就算没有变为0,在最后析构的时候也会强制delete。
上面那个是我的煞笔言论,shared_ptr的delete内存只会在引用计数为0的时候调用,这就造成了循环引用导致的内存泄漏问题,进而引出了weak_ptr。
写完好像很简单的样子……
另外,shared_ptr并不是线程安全的,这个留待以后再提,而线程安全的RCSP应该有atomic_shared_ptr,应该是这个。
2018-04-04 17:05:13 星期三 更新一个简单实现
template <typename T>
class SmartPointer {
size_t* count;
T* pointer;
SmartPointer()
: pointer(nullptr)
, count(new size_t)
{
}
SmartPointer(T* p)
: pointer(p)
, count(new size_t)
{
*count = 1;
}
SmartPointer(const SmartPointer& sp)
: pointer(sp.pointer)
, count(sp.count)
{
*count++;
}
SmartPointer(SmartPointer&& sp)
: pointer(sp.pointer)
, count(sp.count)
{
++(*count);
}
void operator=(SmartPointer&& sp) { SmartPointer(std::move(sp)); }
~SmartPointer()
{
if (--(*count) <= 0) {
delete count;
delete pointer;
count = pointer = nullptr;
}
}
T* operator->() { return pointer; }
T* operator*() { return *pointer; }
T* get() { return pointer; }
size_t use_count() { return count == nullptr ? 0 : *count; }
bool unique() { return count != nullptr and *(count) == 1; }
void swap(SmartPointer& sp) { swap(sp, *this); }
};