帝国软件怎么做网站如何创建自己的app平台
2026/4/4 8:33:03 网站建设 项目流程
帝国软件怎么做网站,如何创建自己的app平台,wordpress文字添加图片,注册过域名后怎么建设网站提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录一、前置准备1. 带行号的测试代码2. 核心规则#xff08;对应我们的 SharedPtr 实现#xff09;二、逐行执行解析行1#xff1a;打印标题行2#xff1a;构造sp1文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、前置准备1. 带行号的测试代码2. 核心规则对应我们的 SharedPtr 实现二、逐行执行解析行1打印标题行2构造sp1托管字符串对象行3解引用并打印计数行4拷贝构造sp2共享sp1的资源行5打印sp2的值和计数行6sp1调用reset切换托管对象行7打印sp1新对象的信息行8打印sp2的信息行9移动构造sp3转移sp1的所有权行10~11判断sp1是否为空并打印行12打印sp3的信息三、函数结束析构阶段隐式执行四、总结结合我们自定义实现的SharedPtr我将完整拆解test_shared_ptr测试函数的每一行执行逻辑、内存状态、引用计数变化、输出结果并对应到类的实现原理说明原因。一、前置准备1. 带行号的测试代码// 测试SharedPtrvoidtest_shared_ptr(){std::cout\n 测试SharedPtr std::endl;// 行1SharedPtrstd::stringsp1(newstd::string(Hello));// 行2std::cout*sp1强引用计数sp1.use_count()std::endl;// 行3SharedPtrstd::stringsp2sp1;// 拷贝构造 行4std::cout*sp2强引用计数sp1.use_count()std::endl;// 行5sp1.reset(newstd::string(World));// 行6std::cout*sp1强引用计数sp1.use_count()std::endl;// 行7std::cout*sp2强引用计数sp2.use_count()std::endl;// 行8SharedPtrstd::stringsp3std::move(sp1);// 移动构造 行9if(sp1.get()nullptr){// 行10std::coutsp1移动后为空std::endl;// 行11}std::cout*sp3强引用计数sp3.use_count()std::endl;// 行12}2. 核心规则对应我们的SharedPtr实现构造新指针绑定原始指针时创建RefCount对象强引用计数初始化为 1拷贝构造/赋值共享资源和计数强引用计数 1移动构造/赋值转移所有权计数不变化原指针置空reset()/析构调用release()强引用计数 -1计数为0时释放托管的堆内存use_count()返回当前强引用计数无资源时返回0。二、逐行执行解析行1打印标题std::cout\n 测试SharedPtr std::endl;操作控制台输出分割标题无内存操作结果控制台打印 测试SharedPtr 原因标准输出流的常规打印逻辑。行2构造sp1托管字符串对象SharedPtrstd::stringsp1(newstd::string(Hello));操作在堆上创建std::string(Hello)对象调用SharedPtr的有参构造函数sp1托管该对象新建RefCount对象strong_ref 1内存状态sp1.ptr_→ 堆上的Hello字符串sp1.ref_count_→ 计数对象强引用1结果sp1成为第一个托管该字符串的智能指针原因构造函数中非空指针会初始化引用计数为1标记当前只有1个所有者。行3解引用并打印计数std::cout*sp1强引用计数sp1.use_count()std::endl;操作重载operator*获取sp1托管的字符串值调用use_count()读取强引用计数输出结果Hello强引用计数1原因*sp1直接访问托管的字符串内容Hello当前仅sp1持有资源计数为1。行4拷贝构造sp2共享sp1的资源SharedPtrstd::stringsp2sp1;操作调用拷贝构造函数sp2与sp1共享同一块内存和计数对象强引用计数 1内存状态sp1、sp2的ptr_都指向Hello共享的计数对象strong_ref 2结果两个智能指针共享同一个资源原因拷贝构造的核心逻辑是共享所有权计数加1表示新增一个资源所有者。行5打印sp2的值和计数std::cout*sp2强引用计数sp1.use_count()std::endl;输出结果Hello强引用计数2原因sp2与sp1指向同一字符串解引用结果都是Hello计数对象共享无论用sp1还是sp2调用use_count()结果都为2。行6sp1调用reset切换托管对象sp1.reset(newstd::string(World));操作reset函数逻辑调用release()原计数2 → 1计数不为0不释放Hello内存在堆上创建新字符串Worldsp1绑定新对象创建新的计数对象强引用计数重置为1内存状态sp1指向World计数1sp2仍指向Hello计数1结果sp1与sp2彻底分离各自托管独立资源原因reset会先释放当前所有权计数减1再接管新资源计数归1。行7打印sp1新对象的信息std::cout*sp1强引用计数sp1.use_count()std::endl;输出结果World强引用计数1原因sp1已切换到新字符串World且是该资源的唯一所有者计数为1。行8打印sp2的信息std::cout*sp2强引用计数sp2.use_count()std::endl;输出结果Hello强引用计数1原因sp2未被修改依旧持有原Hello字符串且是唯一所有者计数为1。行9移动构造sp3转移sp1的所有权SharedPtrstd::stringsp3std::move(sp1);操作调用移动构造函数将sp1的指针、计数对象转移给sp3计数数值不发生变化原sp1的ptr_和ref_count_置为nullptr内存状态sp3指向World计数1sp1空指针无计数对象结果所有权从sp1转移给sp3sp1失效原因移动语义是所有权转移而非共享因此不修改引用计数仅清空原对象。行10~11判断sp1是否为空并打印if(sp1.get()nullptr){std::coutsp1移动后为空std::endl;}操作get()返回原始指针判断是否为nullptr输出结果sp1移动后为空原因移动构造后sp1的内部指针被主动置空不再持有任何资源。行12打印sp3的信息std::cout*sp3强引用计数sp3.use_count()std::endl;输出结果World强引用计数1原因sp3接管了sp1的资源是World的唯一所有者计数保持1。三、函数结束析构阶段隐式执行当test_shared_ptr函数执行完毕栈上的sp1/sp2/sp3依次析构触发SharedPtr析构函数sp1已为空无任何操作sp2计数1→0释放Hello字符串内存sp3计数1→0释放World字符串内存最终所有堆内存都被自动释放无内存泄漏。四、总结拷贝共享所有权计数1多个指针管理同一块内存计数为0才释放资源移动转移所有权计数不变原指针置空是更高效的所有权传递方式reset主动释放重新绑定先放弃旧资源计数-1再托管新对象引用计数是核心所有共享指针的行为都围绕强引用计数的增减判断内存释放时机。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询