任丘网站优化wordpress 搜索 任意

张小明 2026/1/9 15:20:17
任丘网站优化,wordpress 搜索 任意,wordpress子目录404,那个网站的机票做便宜1.智能指针的引入观察下列程序#xff0c;正常情况下#xff0c;程序new的对象我们能正常释放#xff0c;但是当抛异常出现后#xff0c;后⾯的delete没有得到执行#xff0c;所以内存泄漏了#xff0c;所以我们需要new以后捕获异常#xff0c;捕获到异常后delete内存正常情况下程序new的对象我们能正常释放但是当抛异常出现后后⾯的delete没有得到执行所以内存泄漏了所以我们需要new以后捕获异常捕获到异常后delete内存再把异常抛出将注释部分取消即可。代码语言javascriptAI代码解释double Divide(int a, int b) { // throw Divide by zero condition!; if (b 0) { throw Divide by zero condition!; } else { return (double)a / (double)b; } } void func() { int * arr1 new int[10]; int * arr2 new int[10]; /*try {*/ int x; int y; cin x y; cout Divide(x, y) endl; /*}*/ //catch (...) { // cout delete [] arr1 endl; // cout delete [] arr2 endl; // delete[] arr1; // delete[] arr2; // throw;//异常重新抛出 //} cout delete [] arr1 endl; delete[] arr1; cout delete [] arr2 endl; delete[] arr2; } int main() { try { func(); } catch (const char* errmsg) { cout errmsg endl; } catch (const exception e) { cout e.what() endl; } catch (...) { cout 未知异常 endl; } return 0; }但是因为new本身也可能抛异常两个new和Divide同时有问题呢那我们就要套很多个try---catch语句就很麻烦因此C引入了智能指针这位重量级人物。2.RAII与智能指针的设计思路在C编程中资源管理是一个至关重要的问题尤其是涉及动态内存分配、文件操作、网络连接和线程同步等场景时。如果资源没有被正确释放就会导致内存泄漏或资源占用过长的问题。为了解决这个问题RAIIResource Acquisition Is Initialization资源获取即初始化设计思想应运而生并成为智能指针设计的核心理念之一。2.1 RAII资源获取即初始化2.1.1 RAII 的核心概念RAII 是一种管理资源的 C 编程思想其核心原则是利用对象的生命周期来管理资源的申请与释放确保资源不会被错误地释放或泄露。RAII 主要包含以下几个关键点在对象构造时获取资源即资源的获取和初始化绑定在一起。在对象析构时释放资源当 RAII 对象离开作用域时资源会被自动释放。资源在对象生命周期内始终保持有效不会因为异常或程序流程问题导致资源泄漏。2.1.2 RAII 的典型应用RAII 主要用于管理需要手动释放的资源如动态内存管理new/delete, malloc/free文件操作文件打开/关闭互斥锁lock/unlock网络连接连接/断开2.1.3 代码示例RAII 管理文件句柄代码语言javascriptAI代码解释#include iostream #include fstream class FileGuard { private: std::fstream file; public: // 构造函数打开文件 FileGuard(const std::string filename) { file.open(filename, std::ios::out); if (!file.is_open()) { throw std::runtime_error(文件打开失败); } } // 提供文件流操作 std::fstream get() { return file; } // 析构函数关闭文件 ~FileGuard() { if (file.is_open()) { file.close(); std::cout 文件已关闭\n; } } }; int main() { try { FileGuard fg(example.txt); fg.get() Hello, RAII!; } catch (const std::exception e) { std::cerr 异常 e.what() std::endl; } return 0; }代码解析FileGuard类在构造时自动打开文件在析构时自动关闭文件。即使main函数中抛出异常FileGuard也能保证文件被正确关闭避免资源泄漏。通过RAII 方式不需要手动close()文件降低了出错的可能性。3.1 智能指针的设计思路C 的智能指针Smart Pointer是RAII 思想的典型应用用于管理动态分配的内存避免手动new/delete可能导致的内存泄漏。3.1.1 智能指针的额外需求相比于 RAII 的一般资源管理智能指针除了需要在析构时释放资源之外还需要模仿原生指针的行为即可以像指针一样访问和操作对象。提供安全的引用计数shared_ptr支持多个智能指针共享同一块内存。支持独占管理unique_ptr避免多个指针同时管理同一块内存。3.1.2 智能指针的核心机制智能指针类通过重载运算符来模拟原生指针的行为operator*允许解引用智能指针访问内部对象。operator-允许使用ptr-成员语法访问内部对象。构造函数负责初始化并绑定资源。析构函数负责在合适的时机释放资源。3.1.3 代码示例简单实现一个智能指针代码语言javascriptAI代码解释#include iostream // 自定义智能指针 templatetypename T class SmartPointer { private: T* _ptr; public: explicit SmartPointer(T* ptr nullptr) : _ptr(ptr) {} ~SmartPointer() { delete _ptr; std::cout 资源已释放\n; } // 重载 * 和 - 访问对象 T operator*() { return *_ptr; } T* operator-() { return _ptr; } }; class Test { public: void show() { std::cout 智能指针测试\n; } }; int main() { SmartPointerTest sp(new Test()); sp-show(); // 使用 - 访问 Test 的方法 return 0; // 离开作用域时资源自动释放 }代码解析SmartPointer通过重载operator*和operator-使其行为类似于普通指针。构造时传入new分配的对象析构时自动释放内存避免手动delete带来的错误。接下来我们对引入的例子进行修改这里也是简单实现一个智能指针代码语言javascriptAI代码解释class SmartPtr { public: //模仿RAII SmartPtr(T* ptr) :_ptr(ptr) {} ~SmartPtr() { cout delete _ptr endl; delete[] _ptr; } //重载运算符模拟指针行为方便访问资源 T* operator -() { return _ptr; } T operator *() { return *_ptr; } T operator [](int index) { return _ptr[index]; } private: T* _ptr; }; double Divide(int a, int b) { // throw Divide by zero condition!; if (b 0) { throw Divide by zero condition!; } else { return (double)a / (double)b; } } void func() { SmartPtrint sp1new int[10]; SmartPtrint sp2new int[10]; SmartPtrpairint, int sp3new pairint, int[10]; for (int i 0; i 10; i) { sp1[i] sp2[i] i; } for (int i 0; i 10; i) { cout sp1[i] ; } int x, y; cin x y; cout Divide(x, y) endl; }3.C 标准库智能指针的使用在 C 标准库中智能指针位于memory头文件中因此包含memory头文件后就可以使用智能指针。智能指针的设计目标是自动管理动态分配的资源避免手动new/delete可能导致的内存泄漏和悬空指针问题。除了weak_ptr之外其他标准库智能指针都符合RAII资源获取即初始化原则并且支持像原生指针一样访问资源。不同类型的智能指针主要的区别在于拷贝语义的处理方式。1.auto_ptrC98已废弃auto_ptr是C98设计的智能指针其拷贝行为存在严重问题在拷贝时它会转移资源的管理权导致原来的auto_ptr变成悬空指针容易引发访问非法内存的错误。由于这个设计缺陷C11引入新的智能指针后强烈建议不要使用auto_ptr甚至在 C17被移除。许多公司在 C11 之前就已经明确禁止使用auto_ptr了。2.unique_ptrC11 引入unique_ptr代表独占所有权即不支持拷贝只允许移动std::move()。适用于不需要拷贝的场景资源只能被一个对象管理。离开作用域时自动释放资源。示例代码语言javascriptAI代码解释#include iostream #include memory class Test { public: void show() { std::cout 使用 unique_ptr\n; } }; int main() { std::unique_ptrTest ptr std::make_uniqueTest(); ptr-show(); // std::unique_ptrTest ptr2 ptr; // 错误unique_ptr 不允许拷贝 std::unique_ptrTest ptr2 std::move(ptr); // 允许移动 return 0; // 资源自动释放 }3.shared_ptrC11 引入shared_ptr代表共享所有权即支持拷贝和移动多个shared_ptr可以共享同一个资源。底层使用引用计数来管理资源当最后一个shared_ptr释放时资源才被释放。适用于需要多个对象共享同一资源的场景。示例代码语言javascriptAI代码解释#include iostream #include memory class Test { public: void show() { std::cout 使用 shared_ptr\n; } }; int main() { std::shared_ptrTest p1 std::make_sharedTest(); // 推荐使用 make_shared std::shared_ptrTest p2 p1; // p1 和 p2 共享同一资源 p1-show(); std::cout 引用计数 p1.use_count() std::endl; // 输出 2 return 0; // 只有当 p1 和 p2 都析构资源才会释放 }代码语言javascriptAI代码解释class Date { public: Date(int year2025, int month3, int day15) :_year(year), _month(month), _day(day) { cout Date() endl; } ~Date() { cout ~Date() endl; } int _year; int _month; int _day; }; #include memory int main() { //拷贝后p1悬空了 /*auto_ptrDate p1(new Date(2018, 1, 1)); auto_ptrDate p2(p1); unique_ptrDate p3(new Date(2018, 1, 1));*/ //unique_ptrDate p4(p3)--error; //不支持拷贝支持移动构造移动后p3悬空 //unique_ptrDate p4(move(p3)); shared_ptrDate sp1(new Date); // ⽀持拷贝 shared_ptrDate sp2(sp1); shared_ptrDate sp3(sp2); cout sp1.use_count() endl; sp1-_year; cout sp1-_year endl; cout sp2-_year endl; cout sp3-_year endl; // ⽀持移动但是移动后sp1也悬空 shared_ptrDate sp4(move(sp1)); coutsp1.get() endl; return 0; }4.weak_ptrC11 引入weak_ptr代表弱引用主要用于解决shared_ptr循环引用的问题。weak_ptr不会影响引用计数所以不能直接访问资源必须通过lock()方法转换为shared_ptr才能使用。示例代码语言javascriptAI代码解释#include iostream #include memory class Test { public: void show() { std::cout 使用 weak_ptr\n; } }; int main() { std::shared_ptrTest sp std::make_sharedTest(); std::weak_ptrTest wp sp; // 不影响引用计数 if (auto ptr wp.lock()) { // 需要转换为 shared_ptr 才能访问 ptr-show(); } else { std::cout 对象已释放\n; } return 0; }5. 智能指针的删除器智能指针默认使用delete释放资源因此不能直接用于管理非new分配的资源否则会导致delete释放非法内存。unique_ptr和shared_ptr支持自定义删除器即在构造时传入一个可调用对象函数、lambda、仿函数来指定资源释放方式。例如new[]需要delete[]释放因此unique_ptr和shared_ptr也特化了数组版本。代码语言javascriptAI代码解释//特化版本 unique_ptrDate[] p1(new Date[5]); shared_ptrDate[] p2(new Date[5]);代码语言javascriptAI代码解释struct Date { int _year; int _month; int _day; Date(int year 1, int month 1, int day 1) :_year(year) , _month(month) , _day(day) {} ~Date() { cout ~Date() endl; } }; templateclass T class DeleteArray { public: void operator()(T* ptr) { delete[] ptr; } }; templateclass T void DeleteFunc(T* ptr) { delete[] ptr; } class Fclose { public: void operator()(FILE* ptr) { cout fclose: ptr endl; fclose(ptr); } }; int main() { //程序崩溃 //unique_ptrDate up1(new Date[10]); //shared_ptrDate sp1(new Date[10]); // --------特化版本 //unique_ptrDate[] p1(new Date[5]); // shared_ptrDate[] p2(new Date[5]); //仿函数对象 /// unique_ptrDate, DeleteArrayDate p3(new Date[10],DeleteArrayDate()); // unique_ptr和shared_ptr支持删除器的方式有所不同 // unique_ptr是在类模板参数支持的shared_ptr是构造函数参数支持的 // 使⽤仿函数unique_ptr可以不在构造函数传递因为仿函数类型构造的对象直接就可以调⽤ /*unique_ptrDate, DeleteArrayDate p3(new Date[10]); shared_ptrDate p4(new Date[10], DeleteArrayDate());*/ //函数指针版本 //unique_ptrDate, void(*)(Date*) p1(new Date[3], DeleteFuncDate); //shared_ptrDate p2(new Date[3], DeleteFuncDate); //lambda版本 auto Delete [](Date* ptr) { delete[] ptr; }; //decltype(Delete) 获取 lambda 的类型并作为 unique_ptr 的删除器类型。 unique_ptrDate, decltype(Delete) p1(new Date[3], Delete); shared_ptrDate p2(new Date[3], [](Date* ptr) { delete[] ptr; }); // 实现其他资源管理的删除器 shared_ptrFILE sp5(fopen(Test.cpp, r), Fclose()); shared_ptrFILE sp6(fopen(Test.cpp, r), [](FILE* ptr) { cout fclose: ptr endl; fclose(ptr); }); return 0; }6.make_shared推荐使用shared_ptr除了可以直接用new资源构造还可以使用make_shared()这样更高效make_shared()直接在shared_ptr的引用计数控制块中分配资源减少一次new开销提高性能。make_shared()更安全避免shared_ptr(new T())可能导致的内存泄漏如果new T()之后shared_ptr构造失败可能导致T资源泄漏。示例代码语言javascriptAI代码解释#include iostream #include memory int main() { std::shared_ptrint sp std::make_sharedint(42); // 直接构造对象 std::cout 值 *sp std::endl; return 0; }7. 智能指针的bool转换shared_ptr和unique_ptr都支持operator bool用于检查智能指针是否为空代码语言javascriptAI代码解释std::unique_ptrint up; if (up) { /* 不为空 */ } else { /* 为空 */ }这个特性可以直接用于if语句简化空指针判断。8. 防止隐式转换shared_ptr和unique_ptr的构造函数都使用explicit修饰防止普通指针隐式转换为智能指针代码语言javascriptAI代码解释void func(std::unique_ptrint ptr) {} int main() { // func(new int(10)); // ❌ 错误不能隐式转换 func(std::make_uniqueint(10)); // ✅ 正确必须显式转换 return 0; }总结auto_ptr已废弃拷贝会导致原指针悬空不安全。unique_ptr推荐独占所有权不支持拷贝支持移动适用于不需要共享资源的情况。shared_ptr推荐共享所有权支持拷贝和移动底层使用引用计数。weak_ptr弱引用用于解决shared_ptr的循环引用问题。推荐使用make_shared()更安全更高效。支持自定义删除器适用于new[]和非new资源。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

logo设计网站哪个好一些施工企业机械承包责任制度

魔兽世界API开发快速入门:5步掌握完整开发流程 【免费下载链接】wow_api Documents of wow API -- 魔兽世界API资料以及宏工具 项目地址: https://gitcode.com/gh_mirrors/wo/wow_api 魔兽世界API开发是每个插件开发者必须掌握的核心技能,wow_api…

张小明 2026/1/7 21:11:23 网站建设

网站建设流程范文php做网站需要啥技术

第一章:Python协程复用终极优化方案(千万级请求场景实测有效)在高并发网络服务中,Python的异步协程模型常因资源复用不当导致性能瓶颈。通过深度优化协程调度与连接池管理,可在千万级请求场景下显著提升系统吞吐量并降…

张小明 2026/1/7 21:53:02 网站建设

网站没被收录怎么办正规挣钱最快的app

CosyVoice3中文语音合成模型全面评测 在智能语音技术飞速发展的今天,我们正见证一个从“能说”到“说得像人”的关键跃迁。过去几年里,TTS(Text-to-Speech)系统虽然已经能够流畅朗读文本,但在真实感、个性化和语言适应…

张小明 2026/1/7 20:48:50 网站建设

微信上做网站编辑泰州市建设监理协会网站

续流二极管与TVS如何“默契配合”?揭秘电机保护中的双重防线在设计一个电机驱动电路时,你有没有遇到过这样的问题:MOSFET莫名其妙击穿、系统频繁复位、甚至PCB板上冒出一缕轻烟?这些故障的背后,往往藏着同一个“元凶”…

张小明 2026/1/8 11:57:05 网站建设

上市公司网站建设企业网络推广的方法有哪些

GitHub 组织化管理下的 PyTorch-CUDA-v2.8 协作开发实践 在深度学习项目日益复杂、团队协作频繁的今天,一个常见的痛点是:为什么同样的代码在同事的机器上跑得好好的,到了自己这里却报错不断?依赖版本不一致、CUDA 驱动缺失、cuDN…

张小明 2026/1/7 23:48:23 网站建设

php网站开发是做什么的厦门市建设局新网站

Qwen3-VL医疗影像辅助诊断潜力分析:AI医生新可能 在放射科医生每天面对数百张CT、X光和MRI图像的今天,一个现实问题日益凸显:如何在保证诊断准确性的同时,缓解人力紧张与读片疲劳?传统AI辅助系统往往只能完成“有没有结…

张小明 2026/1/8 20:00:43 网站建设