关注
#include <iostream>
using namespace std;
template<typename T>
class SharedPtr
{
public:
//禁止分配内存时抛出异常
explicit SharedPtr(T *p):ptr(p), use(new (nothrow) size_t(1))
{
//分配内存失败
if (use == nullptr)
{
delete ptr;
ptr = nullptr;
cout << "分配内存失败";
exit(-1);
}
}
explicit SharedPtr(const SharedPtr &rhs) :ptr(rhs.ptr), use(rhs.use)
{
++*use;
}
SharedPtr& operator=(const SharedPtr &rhs)
{
++*rhs.use;
if (--*use == 0)
{
delete ptr;
ptr = nullptr;
delete use;
use = nullptr;
}
ptr = rhs.ptr;
use = rhs.use;
return *this;
}
T* get() const
{
return ptr;
}
size_t use_count() const
{
return *use;
}
bool unique() const
{
return use_count() == 1;
}
//交换两个指针的指向
void swap(SharedPtr &q)
{
SharedPtr temp(q);
q = *this;
*this = temp;
}
T& operator*() const
{
return *ptr;
}
T* operator->() const
{
return & operator*();
}
//虚析构函数
virtual ~SharedPtr()
{
if (--*use == 0)
{
delete ptr;
ptr = nullptr;
delete use;
use = nullptr;
}
}
private:
T *ptr;
size_t *use;
};
int main()
{
//测试
SharedPtr<int> s1(new int(666));
{
SharedPtr<int> s2(s1);
SharedPtr<int> s3(s2);
cout << "*s1 = " << *s1 << endl;
cout << "s1 use_count " << s1.use_count() << endl;
cout << "s1 is unique? " << s1.unique() << endl;
}
SharedPtr<int> s4(new int(888));
SharedPtr<int> s5(s4);
cout << "Before swap:\n";
cout << "*s5 " << *s5 << endl;
cout << "*s1 " << *s1 << endl;
s5.swap(s1);
cout << "After swap:\n";
cout << "*s5 " << *s5 << endl;
cout << "*s1 " << *s1 << endl;
cout << *(s1.get()) << endl;
s1 = s4;
SharedPtr<double> pd1(new double(2.3333));
SharedPtr<double> pd2(new double(0.33333));
cout << "pd1 is unique? " << pd1.unique() << endl;
auto q = &pd1;
cout << "Before swap:\n";
cout << "*pd1 " << *pd1 << endl;
cout << "*pd2 " << *pd2 << endl;
q->swap(pd2);
cout << "After swap:\n";
cout << "*pd1 " << *pd1 << endl;
cout << "*pd2 " << *pd2 << endl;
cout << "test end!\n";
return 0;
}
查看原帖
点赞 评论
相关推荐
牛客热帖
正在热议
# 25届秋招总结 #
341819次浏览 3268人参与
# 我的实习求职记录 #
6078016次浏览 83612人参与
# 北方华创开奖 #
39093次浏览 406人参与
# 地方国企笔面经互助 #
4816次浏览 12人参与
# 职场吐槽大会 #
89757次浏览 740人参与
# 选完offer后,你后悔学本专业吗 #
22413次浏览 160人参与
# 阿里云管培生offer #
39640次浏览 568人参与
# ai智能作图 #
1235次浏览 32人参与
# 运营商笔面经互助 #
91952次浏览 1329人参与
# 海康威视求职进展汇总 #
401652次浏览 3414人参与
# 如果有时光机,你最想去到哪个年纪? #
23426次浏览 469人参与
# 国企还是互联网,你怎么选? #
89721次浏览 697人参与
# 风评不好的公司,你会去吗? #
20521次浏览 94人参与
# 如何一边实习一边秋招 #
998619次浏览 12679人参与
# 腾讯求职进展汇总 #
197760次浏览 1650人参与
# 银行笔面经互助 #
84250次浏览 888人参与
# 第一份工作应该选择高薪还是大平台 #
88718次浏览 590人参与
# bilibili求职进展汇总 #
33713次浏览 360人参与
# 许愿池 #
215251次浏览 2536人参与
# 上班苦还是上学苦呢? #
78119次浏览 723人参与
# 正在实习的你,几点下班 #
53821次浏览 397人参与
# 国央企薪资爆料 #
13163次浏览 96人参与