关注
#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;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 春招什么时候投? #
1122次浏览 19人参与
# 聊聊Agent开发 #
4962次浏览 131人参与
# 春节前,你还在投简历吗? #
2542次浏览 34人参与
# 距离春招还有一个月,你现在是什么开局? #
1402次浏览 25人参与
# 牛客吐槽大会 #
30977次浏览 337人参与
# 春节提前走,你用什么理由请假? #
1326次浏览 26人参与
# 推荐一个值得做的AI项目 #
1644次浏览 57人参与
# 暑期实习什么时候投? #
1851次浏览 40人参与
# 你认为哪个岗位找工作最卷 #
61685次浏览 250人参与
# 一份好的简历长什么样? #
24806次浏览 445人参与
# 你觉得机械有必要实习吗 #
73717次浏览 489人参与
# 实习想申请秋招offer,能不能argue薪资 #
217847次浏览 1166人参与
# 硬件人的简历怎么写 #
326021次浏览 3079人参与
# 如果重来一次你还会读研吗 #
220529次浏览 1994人参与
# 用一句话形容你的团队氛围 #
38236次浏览 283人参与
# 你的mentor是什么样的人? #
52211次浏览 746人参与
# 刚入职就____,这样正常吗? #
127998次浏览 671人参与
# 面试常问题系列 #
272923次浏览 4692人参与
# 校招第一份工作你干了多久? #
137450次浏览 601人参与
# 职场破防瞬间 #
362273次浏览 2837人参与
查看10道真题和解析