关注
#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;
}
查看原帖
点赞 评论
相关推荐
查看10道真题和解析 点赞 评论 收藏
分享
球球与墩墩:这不是前端常考的对象扁平化吗,面试官像是前端出来的
const flattern = (obj) => {
const res = {};
const dfs = (curr, path) => {
if(typeof curr === 'object' && curr !== null) {
const isArray = Array.isArray(curr);
for(let key in curr) {
const newPath = path ? isArray ? `${path}[${key}]` : `${path}.${key}` : key;
dfs(curr[key], newPath);
}
} else {
res[path] = curr
}
}
dfs(obj);
return res;
}
查看3道真题和解析 点赞 评论 收藏
分享
牛客热帖
更多
- 1... 腾讯、快手、百度Q3财报新鲜出炉!8360
- 2... Gemini3用了吗,前端是不是无了?3208
- 3... 【Offer帮选】专家大佬在线接单!发帖即享免费1V1抉择指导3035
- 4... 双九无实习 CPP 拿下 SSP-秋招总结(其二)2862
- 5... 震惊!某HR居然给我发了这样的邮件......2304
- 6... “受虐狂”再选一次还要选这份苦差事2180
- 7... 学院本放弃秋招了2132
- 8... wxg和字节flow咋选2090
- 9... 双九无实习CPP拿下SSP-秋招总结(其一)1954
- 10... 秋招收官!小红书你PK赢了1749
正在热议
更多
# 那些年,我收到的‘奇葩’回复 #
14109次浏览 126人参与
# 材料人,你最希望上岸的是? #
10029次浏览 54人参与
# 小红书开奖了 #
29143次浏览 150人参与
# OC/开奖 #
179017次浏览 1280人参与
# 秋招你经历过哪些无语的事 #
15129次浏览 182人参与
# 职场中那些令人叹为观止的八卦 #
24103次浏览 220人参与
# 腾讯音乐秋招 #
428320次浏览 4767人参与
# AI时代,哪些岗位最容易被淘汰 #
8231次浏览 74人参与
# 秋招吐槽大会 #
74507次浏览 655人参与
# 你找工作想离家近 or 离家远? #
13739次浏览 219人参与
# 我的职场社死时刻 #
17664次浏览 152人参与
# 实习学不到东西怎么办? #
262845次浏览 2483人参与
# 你秋招最后悔的选择 #
13785次浏览 106人参与
# 校招薪资来揭秘 #
59004次浏览 386人参与
# XX请雇我工作 #
12889次浏览 108人参与
# 哪些公司开始补录了 #
17939次浏览 148人参与
# 来聊聊机械薪资天花板是哪家 #
153551次浏览 829人参与
# 得物求职进展汇总 #
133783次浏览 961人参与
# 小马智行求职进展汇总 #
16726次浏览 54人参与
# 实习心态崩了 #
90763次浏览 480人参与
# 租房前辈的忠告 #
286379次浏览 7256人参与
# 你父母给过你哪些不靠谱的职场建议? #
13023次浏览 177人参与
