当前位置: 首页 > wzjs >正文

中山市seo上词百度seo工作室

中山市seo上词,百度seo工作室,北京网站制作设计与开发服务,做钢材生意选什么网站通常在面试中需要手撕实现的是shared_ptr,其主要特性是使用一个计数器进行对资源的管理。在面试中只需要简单要实现的以下功能: 引用计数:通过计数器跟踪指针被引用的次数自动内存管理:当引用计数归零时自动释放内存拷贝语义&…

通常在面试中需要手撕实现的是shared_ptr,其主要特性是使用一个计数器进行对资源的管理。在面试中只需要简单要实现的以下功能:

  1. 引用计数:通过计数器跟踪指针被引用的次数
  2. 自动内存管理:当引用计数归零时自动释放内存
  3. 拷贝语义:支持深拷贝,增加引用计数
  4. 移动语义:支持资源所有权的转移
  5. 异常安全:移动操作使用noexcept保证安全性
  6. 操作符重载:支持常规指针的*和->操作

1、成员变量

也就是说在其中需要两个成员变量,一个是需要存储的指针,另一个是一个计数器。

那么计数器的类型是什么?

首先,该指向同一个资源的计数器值需要相同,可以同步对计数器的增加或减少。截至到这时有两种方式

1、指针

2、static。

那么他们有什么区别?static在泛型编程中每一个类型都共享这个变量,而同一个类型不一定只有一个资源。所以static不可行。也就是说是这样的

template <typename T>
class  SmartPoint
{
private:T* prt;size_t* count;
};

2、计数器减少

由于拷贝构造和析构函数都有可能对计数器经行减少删除,所以将这一步封装成一个新的函数(记得是私有函数)。

void release() {if(--(*count) == 0){delete ptr;delete count;ptr = nullptr;count == nullptr;std::cout << "资源已经释放" << std::endl;}}

3、构造函数、析构函数

通常在智能指针构造函数中,我们都是传入一个new出来的指针交由智能指针管理或是不传参。且我们不希望指针在传入时出现隐式类型转换,所以使用explicit关键字

	explicit SmartPoint(T* p = nullptr) :ptr(p),count(new size_t(1)){std::cout << "创建智能指针" << endl;}~SmartPoint(){if (count)release();}

4、拷贝构造函数、拷贝赋值运算符

在这两个中要注意的就是为了防止两个成员变量发生改变要使用const,以及拷贝赋值运算符需要返回*this(见Effective C++条款10:令operator=返回一个reference to *this)和this在拷贝赋值前需要先删除原先资源。

	SmartPoint(const SmartPoint<T>& other):ptr(other.ptr), count(other.count){++(*count);std::cout << "拷贝构造智能指针" << (*count) << std::endl;}SmartPoint<T>& operator=(const SmartPoint<T>& other){if (this != &other){release();ptr = other.ptr;count = other.count;++(*count);std::cout << "拷贝赋值,计数" << *count << std::endl;}return *this;}

5、移动拷贝构造函数、移动拷贝赋值运算符

移动拷贝是对资源的直接移动,不会让计数器发生增加或者减少,因为传入的是右值,只需要将资源转移就行。

要注意的是容器重新分配时,使用移动而不是拷贝,前提是移动操作是noexcept的,否则会回退到拷贝,影响性能。

SmartPoint(SmartPoint<T>&& other) noexcept:ptr(other.ptr), count(other.count){other.ptr = nullptr;other.count = nullptr;}SmartPoint<T>& operator=(SmartPoint<T>&& other) noexcept {if (this != &other){release();ptr = other.ptr;count = other.count;other.ptr = nullptr;other.count = nullptr;}return *this;}

6、重载操作符

T& operator*() const { return *ptr; }T* operator->() const { return ptr; }size_t use_count() const { return count ? *count : 0; }

7、测试

// 示例使用
int main() {SmartPoint<int> p1(new int(42));  // 计数 1{SmartPoint<int> p2 = p1;      // 拷贝构造,计数 2SmartPoint<int> p3;p3 = p2;                        // 拷贝赋值,计数 3std::cout << "数值: " << *p3 << "\n";}                                   // p2/p3 析构,计数 1SmartPoint<int> p4 = std::move(p1); // 移动构造std::cout << "移动后计数: " << p4.use_count() << "\n";return 0;
}

请添加图片描述

http://www.dtcms.com/wzjs/109645.html

相关文章:

  • 嘉兴网站制作公司搜外友链
  • 惠州哪家做网站比较好合理使用说明
  • 我在学校志愿队做网站的经历互联网怎么赚钱
  • 杭州下沙开发区建设局网站浏览器网站大全
  • 建设 展示型企业网站常用的网站推广方法
  • 网站建设供应商广州百度关键词推广
  • 网站做点击广告是怎么回事网站seo培训
  • 苏州怎么制作网页网站甘肃省seo关键词优化
  • 做淘宝优惠券怎么有网站源码交易网站源码
  • 阿里云虚拟主机做多个网站必应bing搜索引擎
  • 深圳有哪些做网站的公司百度高级搜索引擎入口
  • 建设电子商务网站总结百度搜索指数排行榜
  • 全球域名深圳做seo有哪些公司
  • .net开发微信网站网站换了域名怎么查
  • 做网站什么价位怎样在百度发广告贴
  • 网站项目遇到的问题seo常见优化技术
  • 分类信息网站建设多少钱如何做市场推广方案
  • 沈阳做网站优化百度搜索下载安装
  • 吉林省人民政府文件南宁seo外包服务商
  • 佛山市建网站做网站费用怎么给自己的公司建立网站
  • 免费b站动漫推广网站2023免费推客推广平台
  • 加强网站信息内容建设的意见营销软文范例500
  • 学院网站建设的需求分析编程培训机构加盟哪家好
  • 建立网站的是什么人免费b站网站推广
  • 东莞飞天网站设计公司竹子建站官网
  • 疫情最新进展石狮seo
  • 做冷库用什么网站发帖子好怀柔网站整站优化公司
  • 站酷网站源码百度首页排名代发
  • 网站建设与维护税率org域名注册
  • 如何做网站图片小红书推广费用一般多少