#include<iostream>
using namespace std;
template<class T>
class SharedPtr {
private:
T* ptr_;
int* pCount_;
public:
SharedPtr(T* p) : ptr_(p), pCount_(new int(1)) {}
SharedPtr(SharedPtr& s) {
ptr_ = s.ptr_;
pCount_ = s.pCount_;
++(*pCount_);
}
T& operator*() {
return *ptr_;
}
T* operator->() {
return ptr_;
}
int getCount() {
return *pCount_;
}
~SharedPtr() {
(*pCount_)--;
if (0 == *pCount_) {
delete ptr_;
ptr_ = NULL;
delete pCount_;
pCount_ = NULL;
}
}
};
class Test {
public:
Test() : v(0) {
std::cout << "constructor" << std::endl;
}
~Test() {
cout << "de-constructor" << std::endl;
}
void TestFunc() {
std::cout << "test func" << std::endl;
}
int v;
};
int main() {
Test *p = new Test();
SharedPtr<Test> s1(p);
SharedPtr<Test> s2(s1);
s1->TestFunc();
std::cout << "s1 count=" << s1.getCount() << std::endl;
std::cout << "s2 count=" << s2.getCount() << std::endl;
return 0;
}
auto_ptr
auto_ptr不能共享所有权
赋值转移所有权后,原autoptr为野指针,会crash
不能指向一组对象
不能与标准容器一起使用
不能通过赋值操作来初始化auto_ptr
uniq_ptr
auto_ptr支持拷贝构造与赋值操作,但unique_ptr不直接支持
不提供复制语义(拷贝赋值和拷贝构造都不可以),只支持移动语义(move semantics)
unique_ptr可做为容器元素
unique_ptr可以用在函数返回值中
weak_ptr
没有重载opreator*和->操作符,也就意味着即使分配到对象,他也没法使用该对象
从weak_ptr调用lock()可以得到shared_ptr或者直接将weak_ptr转型为shared_ptr
他不像其余三种,可以通过构造函数直接分配对象内存;他必须通过shared_ptr来共享内存
不主动参与引用计数,即,share_ptr释放了,那么weak_ptr所存的对象也释放了
使用成员函数use_count()可以查看当前引用计数,expired()判断引用计数是否为空。
shared_ptr
两次从同一个裸指针构造sharedptr,析构会crash
循环引用的问题