关注
#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;
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享

点赞 评论 收藏
分享
05-29 09:02
门头沟学院 Java 点赞 评论 收藏
分享
06-26 17:10
复旦大学 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 你觉得现在还能进互联网吗? #
1549次浏览 51人参与
# 如何准备秋招 #
4461次浏览 71人参与
# 现代汽车前瞻技术研发急速编程挑战赛 #
18141次浏览 159人参与
# 实习,不懂就问 #
14169次浏览 207人参与
# 哪个瞬间让你对大厂祛魅了? #
379357次浏览 2777人参与
# 你觉得实习能学到东西吗 #
6614次浏览 152人参与
# 如果中了500万,你会离职吗? #
86174次浏览 675人参与
# 面试时被问的最奇葩的问题 #
21490次浏览 124人参与
# 秋招什么时候开投比较合适? #
2732次浏览 51人参与
# 每个月的工资都是怎么分配的? #
6552次浏览 130人参与
# 软开人,秋招你打算投哪些公司呢 #
99394次浏览 932人参与
# 来聊聊你认为的薪资天花板是哪家? #
30276次浏览 173人参与
# 腾讯工作体验 #
473531次浏览 3489人参与
# 预测一下26届秋招形势 #
10253次浏览 115人参与
# 打工人的精神状态 #
51610次浏览 933人参与
# 职场情商大赛 #
131157次浏览 655人参与
# 非技术2024笔面经 #
384520次浏览 4732人参与
# 高考出分的那一天,我__ #
9194次浏览 141人参与
# 一觉醒来,秋招难度下降一万倍…… #
83497次浏览 642人参与
# 京东美团大战,你怎么看? #
92414次浏览 569人参与
# 你们公司几号发工资 #
18326次浏览 114人参与