改造一下标准库里的share指针
// 需要一个结构体保存计数器和裸指针
template <typename T>
struct Conptr {
T * ptr;
unsigned int Counter;
};
template <class T>
class shared_ptr {
public:
Conptr<T> * ptr;
// 允许通过 () 或者 = 传入指针
shared_ptr(T *aptr){
ptr = new Conptr<T>;
ptr->ptr = aptr;
ptr->Counter = 1;
}
// 允许复制构造
shared_ptr(const shared_ptr<T*> & aptr){
ptr = aptr->ptr;
ptr->Counter ++;
}
~shared_ptr(){
ptr->Counter --;
if(ptr->Counter == 0){
delete ptr->ptr;
delete ptr;
}
}
T * const operator -> (){
return ptr->ptr;
}
// 禁止循环构造
shared_ptr & operator = (shared_ptr & aptr) = delete;
// 禁止生成裸指针
shared_ptr() = delete;
// 通过get()得到值,而不是指针
T & get(){
return * (ptr->ptr);
}
};
class test{
public:
test(){std::cout<<"create an obj of the test class";}
~test(){std::cout<<"delete the obj";}
};
int main(){
shared_ptr ptr = new int;
ptr.get() = 10;
std::cout << ptr.get();
shared_ptr ptr2 = ptr;
{
shared_ptr tp = new test;
}
auto test_for_function [&](const shared_ptr & p){
share_ptr t = p;
return t;
}
shared_ptr tp2 = test_for_function();
ptr2 = ptr; // error
shared_ptr<int> ptr3; // error
}