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

网站建设确认报告有成功案例的网站

网站建设确认报告,有成功案例的网站,无锡网站外包,网站定制排名C/C指针智能指针二 文章目录 C/C指针智能指针二1.智能指针简介2.独占智能指针unique_ptr1.基本概念2.使用方法1.初始化 3.使用技巧 3.共享智能指针1.基本概念2.使用方法3.注意事项 4.智能指针删除器1.如何使用删除器2.应用场景 5.弱智能指针weak_ptr1.基本概念2.使用…C/C指针智能指针二 文章目录 C/C指针智能指针二1.智能指针简介2.独占智能指针unique_ptr1.基本概念2.使用方法1.初始化 3.使用技巧 3.共享智能指针1.基本概念2.使用方法3.注意事项 4.智能指针删除器1.如何使用删除器2.应用场景 5.弱智能指针weak_ptr1.基本概念2.使用方法3.注意事项 1.智能指针简介 C智能指针是为了解决原始指针可能导致的内存泄漏、悬挂指针等问题而引入的。它们是C标准库中模板类自动管理指针所指向对象的生命周期以RAIIResource Acquisition Is Initialization原则为基础确保了对象在不再需要时能被正确地销毁和释放内存。C11引入了三种主要的智能指针std::unique_ptr、std::shared_ptr 和 std::weak_ptr。 std::unique_ptr独占智能指针: std::unique_ptr 表示对一个对象的独占所有权。一个对象只能有一个 unique_ptr 拥有者当这个 unique_ptr 离开作用域或者被显式重置时它所指向的对象会被自动删除。它不支持拷贝构造函数和赋值操作符但支持移动语义可以通过移动构造函数或移动赋值将所有权转移给另一个 unique_ptr。 std::shared_ptr共享拥有权智能指针: std::shared_ptr 允许多个智能指针共享同一个对象的所有权。它内部维护了一个引用计数器每当一个新的 shared_ptr 被创建指向同一个对象时引用计数增加当一个 shared_ptr 被销毁或被重置时引用计数减少。当引用计数降至0时对象被自动删除。由于其共享性质shared_ptr 支持拷贝构造和赋值操作。 std::weak_ptr弱引用智能指针: std::weak_ptr 是一种不增加引用计数的智能指针它观测由某个 shared_ptr 管理的对象。主要用于解决循环引用问题因为 weak_ptr 不影响对象的生命周期即使持有该 weak_ptr 的所有对象都存在也不会阻止被观测的对象被销毁。使用 weak_ptr 需要通过 lock() 成员函数转换为临时的 shared_ptr 才能访问对象以检查对象是否还存在。 这些智能指针的使用简化了资源管理减少了内存泄漏的风险并且提高了代码的安全性和可维护性。在现代C编程中它们被广泛推荐用于原生指针的替代品。 2.独占智能指针unique_ptr 1.基本概念 std::unique_ptr 是C中的一种独占式智能指针它体现了唯一拥有权的概念。这意味着在同一时间内只能有一个 unique_ptr 实例指向某个动态分配的内存区域。这种设计旨在防止多个指针同时修改或释放同一块内存从而避免了资源竞争和潜在的内存泄漏问题。 所有权转移unique_ptr 支持移动语义通过移动构造函数和移动赋值运算符允许将所有权从一个 unique_ptr 转移到另一个 unique_ptr 上但不支持普通的拷贝没有拷贝构造函数和拷贝赋值运算符。 自动管理内存当 unique_ptr 离开其作用域时它会自动删除所管理的动态分配的对象无须手动调用 delete。 初始化与重置 初始化可以通过直接初始化或赋值初始化创建 unique_ptr并立即让它管理一个新分配的内存。重置可以使用 reset() 方法来让 unique_ptr 管理一个新的对象或释放当前管理的对象。 裸指针访问提供了 get() 方法来获取底层的原始指针便于与不接受智能指针的旧代码交互。 示例 #include iostream #include memoryint main() {// 创建并初始化unique_ptrstd::unique_ptrint ptr(new int(42));// 访问unique_ptr管理的对象std::cout Value: *ptr std::endl;// 通过移动构造函数转移所有权std::unique_ptrint anotherPtr(std::move(ptr));// 此时ptr不再拥有任何对象if (!ptr) {std::cout ptr is now empty. std::endl;}// 可以继续使用anotherPtr*anotherPtr 100;std::cout New value: *anotherPtr std::endl;return 0; }在这个例子中unique_ptr ptr 初始化后管理一个整数值为42的动态分配的内存。然后通过移动构造函数这个管理权被转移到了 anotherPtr之后 ptr 就不再拥有任何对象。最后我们修改了 anotherPtr 指向的值并打印出来展示了所有权转移和自动内存管理的特性。 为什么要使用智能指针呢 看下面这个例子 // // Created by 86189 on 2024/7/14. // #include iostreamusing namespace std;class student{ public:string name;student(){cout nothing func endl;}student(string name){this-name name;cout have func endl;}~student(){cout delete func endl;} };int main(){student *p new student;p-name jack;return 0; }运行程序发现只用类的无参构造函数被调用 而析构函数并没有被调用也就是说我们new出来的空间并没用被释放当我们在程序的结尾添加上delete p时析构函数才被调用。而当我们使用智能指针时如下 // // Created by 86189 on 2024/7/14. // #include iostream #include utility #include memoryusing namespace std;class student{ public:string name;student(){cout nothing func endl;}explicit student(string name){this-name std::move(name);cout have func endl;}~student(){cout delete func endl;} };int main(){auto *p new student; // p-name jack; // delete p;unique_ptrstudentptr(p);ptr-name jack;return 0; }并不需要我们主动释放内存编译器会自动帮我们释放。 2.使用方法 1.初始化 方法一 unique_strtypetptr(new typet(value)); //分配内存并初始化 例如 unique_strstudentptr(new student(jack));方法二 unique_strtypetptr make_ptrtypet(value) 例如 unique_strstudentptr make_ptrstudent(jack);方法三 auto *p new type; unique_strtypetptr(p); //使用已知的地址初始化 例如 auto *p new student; unique_ptrstudentptr(p); ptr.get(); // 返回原始指针p注意 不能普通指针赋值给智能指针 不能使用智能指针的拷贝构造函数 不能使用对智能指针进行赋值 智能指针重载*操作符可以使用解引用操作 在智能指针作为函数参数进行传递时不能使用值传递可使用传递引用或者地址 void func(unique_ptrint ptr) 智能指针不支持指针的运算 3.使用技巧 利用构造函数初始化最好在定义 unique_ptr 时就直接初始化它这样可以确保资源从一开始就得到妥善管理。避免先声明后初始化这可能会导致资源泄露。 使用make_unique自C14起推荐使用 std::make_unique 函数来创建 unique_ptr这样可以更安全地处理异常情况并且代码更简洁易读。 auto ptr std::make_uniqueMyClass(args...);利用移动语义通过移动构造函数和移动赋值操作符可以在函数之间高效地传递所有权。这在需要将资源所有权从一个作用域转移到另一个作用域时特别有用。 void foo(std::unique_ptrMyClass ptr) {// ... }int main() {auto ptr std::make_uniqueMyClass();foo(std::move(ptr)); // 移动所有权// 此处ptr不再拥有对象 }避免裸指针操作尽量使用 unique_ptr 管理对象避免直接使用裸指针以减少内存泄漏的风险。 使用get()与释放所有权在需要将 unique_ptr 管理的对象传递给API该API期望裸指针时可以使用 get() 方法获取原始指针。但是务必确保不会因此导致对象的生命周期管理出现问题。 利用reset()进行重置当需要改变 unique_ptr 管理的对象时可以使用 reset() 方法。如果之前管理了对象它会被正确销毁。 ptr.reset(new MyClass()); // 重新分配内存 ptr.reset(); // 释放当前管理的内存使unique_ptr变为nullptr避免循环依赖由于 unique_ptr 不支持共享所有权所以在设计类的成员时应避免通过 unique_ptr 形成循环依赖这可能导致资源无法释放。 模板与多态unique_ptr 可以用于持有基类指针实现多态性并且能够安全地管理派生类对象的生命周期。这在设计灵活且类型安全的系统时非常有用。 单元测试在编写使用 unique_ptr 的类或函数的单元测试时可以先在栈上创建对象进行测试以确保逻辑正确然后再使用智能指针进行集成测试。 文档化所有权转移在代码中明确注释所有权的转移特别是当通过函数参数或返回值进行传递时有助于提高代码的可读性和维护性。 3.共享智能指针 std::shared_ptr 是C中一种基于引用计数的智能指针它允许多个 shared_ptr 实例共享同一个对象的所有权。当最后一个指向该对象的 shared_ptr 销毁时该对象会被自动删除从而有效防止内存泄漏。 1.基本概念 引用计数shared_ptr 内部维护一个引用计数器记录有多少个 shared_ptr 指向同一个对象。每当创建一个新的 shared_ptr 指向该对象时引用计数增加当一个 shared_ptr 被销毁或被重置指向其他对象时引用计数减少。当引用计数降至0对象将被自动析构。 共享所有权多个 shared_ptr 可以同时拥有同一个对象的所有权任何一个 shared_ptr 的析构都会减少引用计数当引用计数为0时对象被释放。 线程安全性shared_ptr 的引用计数操作通常是线程安全的原子操作这意味着在多线程环境下增加或减少引用计数不会引发数据竞争。然而如果多个线程同时修改 shared_ptr 例如通过赋值或重置则需要外部同步机制来保证线程安全。 2.使用方法 创建与初始化 直接初始化std::shared_ptrint sptr(new int(42));使用 make_shared推荐做法因为更高效且能确保内存分配与构造函数调用的原子性。std::shared_ptrint sptr std::make_sharedint(42);拷贝与赋值shared_ptr 支持拷贝构造函数和赋值运算符拷贝后两个 shared_ptr 实例将共享同一个对象的所有权。 std::shared_ptrint sptr2 sptr; // sptr和sptr2现在共享所有权访问原始指针使用 get() 方法获取原始指针。 int* rawPtr sptr.get();检查是否为空使用 bool 类型转换或 expired() 方法检查 shared_ptr 是否为空或所指向的对象是否已被释放。 if (sptr) { /* 非空 */ }重置与交换 reset() 方法可以用来释放当前指向的对象如果引用计数允许的话并可选择指向新的对象。swap() 方法可以交换两个 shared_ptr 的管理对象。 自定义删除器在创建 shared_ptr 时可以提供一个自定义删除器用于在对象被删除时执行特定的操作。 3.注意事项 循环引用shared_ptr 最大的风险在于可能引起循环引用导致对象无法释放。在涉及循环引用的场景中应该考虑使用 std::weak_ptr 来断开引用链。 性能考量由于引用计数的维护shared_ptr 相比于原始指针或 unique_ptr 会有一定的性能开销尤其是在频繁拷贝或分配大量小对象时。 资源管理虽然 shared_ptr 自动管理内存但正确使用它仍需开发者对对象生命周期有清晰的认识避免不必要的资源占用。 4.智能指针删除器 智能指针删除器是在C中使用智能指针如std::unique_ptr和std::shared_ptr时提供的一种机制用于自定义管理所指向对象生命周期结束时的清理行为。默认情况下智能指针使用delete操作符来释放内存但通过指定删除器你可以改变这一行为以适应更复杂的资源管理需求比如管理通过malloc分配的内存、关闭文件描述符、释放自定义资源等。 1.如何使用删除器 对于std::unique_ptr void customDeleter(int* ptr) {// 自定义释放内存或其他操作free(ptr); // 或其他清理操作 }std::unique_ptrint, decltype(customDeleter) uniquePtr(new int(42), customDeleter);在这里decltype(customDeleter) 是删除器类型的显式指定customDeleter 是实际的删除器函数。 对于std::shared_ptr std::shared_ptrint sharedPtr(new int(42), customDeleter);同样customDeleter 是自定义的删除器函数但在这里类型推导会自动确定删除器的类型所以不需要显式指定。 使用lambda作为删除器 auto deleter [](int* ptr) {// 自定义释放逻辑delete ptr; }; std::unique_ptrint, decltype(deleter) uniquePtrWithLambda(new int(42), deleter);使用std::make_shared与删除器 对于std::shared_ptr虽然std::make_shared不直接支持传递删除器但可以通过创建一个没有删除器的shared_ptr然后使用std::shared_ptr的拷贝构造函数和自定义删除器来创建一个新的shared_ptr实例。 2.应用场景 当对象不是通过new分配的而是通过其他方式如malloc分配时需要自定义删除器来释放资源。管理非内存资源如文件句柄、网络连接等需要在对象生命周期结束时执行特定的清理操作。在需要执行额外清理工作或者遵循特定清理协议的情况下。 通过使用自定义删除器智能指针变得更加灵活能够适应更广泛的资源管理需求增强了C代码的安全性和可维护性。 5.弱智能指针weak_ptr std::weak_ptr 是C智能指针家族中的一个成员专门设计用于解决由std::shared_ptr引起的循环引用问题。它是对shared_ptr所管理对象的一种非拥有或者说不增加引用计数的引用方式主要用于监控对象的存在性而不影响对象的生命周期管理。 1.基本概念 非拥有性weak_ptr 不增加它所指向的shared_ptr管理对象的引用计数。这意味着即使存在多个weak_ptr指向同一对象该对象也仅当最后一个关联的shared_ptr销毁时才会被释放。 监测作用它主要用于在不延长对象生命周期的前提下安全地访问可能由shared_ptr管理的对象。这对于避免因循环引用导致的内存泄漏尤为重要。 生存确认由于weak_ptr不控制对象生命周期使用前必须通过lock()方法检查对象是否仍然存在lock()会返回一个指向相同对象的临时shared_ptr若对象已被销毁则返回一个空的shared_ptr。 2.使用方法 从shared_ptr创建 std::shared_ptrint sptr std::make_sharedint(42); std::weak_ptrint wptr(sptr); // 从shared_ptr构造weak_ptr检查对象有效性 if(auto sp wptr.lock()) { // 尝试锁定并检查对象是否存在std::cout *wptr: *sp std::endl; // 安全访问对象 } else {std::cout Object no longer exists. std::endl; }访问对象通过lock()方法获得的临时shared_ptr来访问对象确保了对象存在的同时也遵循了RAII原则。 循环引用解决方案在设计含有相互引用的类时可以使用weak_ptr替代一个方向上的shared_ptr引用以打破循环确保没有不必要的生命周期扩展。 3.注意事项 非直接访问weak_ptr本身不支持类似*或-这样的直接访问操作必须先转换为shared_ptr。 生命周期管理尽管weak_ptr不直接影响对象生命周期但应谨慎使用避免不经意间延长了对象的生命周期尤其是当使用lock()后未及时释放对应的shared_ptr时。
http://www.zqtcl.cn/news/624306/

相关文章:

  • 网站内部优化策略获取网站的路径
  • 网站群 优点今天西安最新通告
  • 惠济免费网站建设设计制作的广告公司
  • 做一个网站建设装潢设计属于什么专业
  • 水处理网站源码注册销售公司流程和费用
  • 诸城网站建设0536s整站优化seo排名点击
  • 企业建设网站需注意哪些内容苏州网站怎么做
  • 浏览器打开网站网站推广软件工具
  • 网站主题编辑工具WordPress公司网站策划方案
  • 做旅游网站选什么空间搜索引擎优化策略有哪些
  • 网站备案多少钱安全网站建设与服务的关系
  • 手机端网页设计尺寸规范优化seo排名
  • 做网站业务提成多少厦门十大装修公司排名榜
  • 为什么用开源建站wordpress rss 插件
  • 语文建设投稿网站南昌做网站的公司多不多
  • 石家庄网站建设的公司功能性质网站
  • 企业网站主页模板装饰公司名字起名大全
  • 马鞍山网站设计价格如何在微信公众号内部做网站
  • 申请网站建设经费的报告生态建设网站
  • 建网站要多少钱用自己的服务器河北工程大学网站开发成本
  • 宁波网站建站公司商务网站模块设计时前台基础设施建设不包括
  • 徐州免费网站制作怎么用阿里云服务器搭建wordpress
  • php猎奇源码 织梦新闻视频图片八卦娱乐趣事资讯门户网站模板html代码表格
  • 南通做网站优化哪家好网页策划书 网站建设定位
  • 防止访问网站文件夹绵阳 网站设计
  • 网页与网站的区别是什么东莞网站公司排名
  • 盐城市城乡和住房建设厅网站wordpress文章订阅
  • 济南网站优化wordpress文件上传到那个文件
  • 外贸网站租用外国服务器好还是自己装一个服务器好高质量外链网站
  • 珠海专门做网站成都到西安