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

公司网站建设征求意见表开封市住房和城乡建设网站

公司网站建设征求意见表,开封市住房和城乡建设网站,深圳 购物商城网站建设,企业网站托管公司写重载取地址运算符发现的好例子,干脆单独写一篇来讲 1. 什么是智能指针? 智能指针是 C 标准库提供的一种类模板,它封装了原始指针并提供了自动管理内存的功能,避免了手动管理内存(new 和 delete)时容易出…

 写重载取地址运算符发现的好例子,干脆单独写一篇来讲

1. 什么是智能指针?

智能指针是 C++ 标准库提供的一种类模板,它封装了原始指针并提供了自动管理内存的功能,避免了手动管理内存(newdelete)时容易出现的错误,如内存泄漏和野指针等问题。

2. std::unique_ptr

std::unique_ptr 是一种 独占所有权 的智能指针,它表示一个指针拥有一个资源的所有权,并且资源的所有权不能被共享。 std::unique_ptr 在其生命周期结束时会自动释放资源。

特点
  • 不能被复制:unique_ptr 只能通过移动(std::move)来转移所有权。
  • 自动释放资源:当 unique_ptr 被销毁时,它会自动释放其指向的资源。
#include <iostream>
#include <memory> // 包含 unique_ptrclass MyClass {
public:MyClass() { std::cout << "MyClass Constructor!" << std::endl; }~MyClass() { std::cout << "MyClass Destructor!" << std::endl; }void display() {std::cout << "Hello from MyClass!" << std::endl;}
};int main() {// 使用 unique_ptr 管理 MyClass 对象std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();// 调用成员函数ptr1->display();// 在这里 ptr1 被销毁,自动调用析构函数,释放 MyClass 对象return 0;
}
  • std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();std::make_unique 用来创建一个 unique_ptr 并初始化它,ptr1 拥有这个 MyClass 对象的所有权。
  • ptr1 离开作用域时,它会自动释放内存,调用 MyClass 的析构函数。

 

你可以看到,unique_ptr 保证了 MyClass 对象在不再使用时会被自动销毁。

注意:
  • 不能复制 unique_ptr,只能转移所有权。反例如下面代码
std::unique_ptr<MyClass> ptr2 = ptr1; // 编译错误,不能复制 unique_ptr

不过你可以使用 std::move 转移所有权:

std::unique_ptr<MyClass> ptr2 = std::move(ptr1); // 正确,ptr1 的所有权被转移给 ptr2

3. std::shared_ptr

std::shared_ptr 是一种 共享所有权 的智能指针,它允许多个 shared_ptr 对象共同拥有同一个资源。资源会被自动释放,当所有指向资源的 shared_ptr 被销毁时,资源才会被释放。

特点
  • 共享所有权:多个 shared_ptr 可以指向同一个资源。
  • 引用计数shared_ptr 内部维护一个引用计数,记录有多少个 shared_ptr 指向同一个对象。当引用计数为 0 时,资源才会被销毁。
  • 线程不安全:引用计数的增加和减少不是线程安全的,如果需要跨线程使用,需要自行加锁。
#include <iostream>
#include <memory> // 包含 shared_ptrclass MyClass {
public:MyClass() { std::cout << "MyClass Constructor!" << std::endl; }~MyClass() { std::cout << "MyClass Destructor!" << std::endl; }void display() {std::cout << "Hello from MyClass!" << std::endl;}
};int main() {// 使用 shared_ptr 管理 MyClass 对象std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();// 共享 ptr1 的所有权std::shared_ptr<MyClass> ptr2 = ptr1;std::cout << "Reference count: " << ptr1.use_count() << std::endl; // 输出 2// 调用成员函数ptr1->display();ptr2->display();std::cout << "Reference count: " << ptr1.use_count() << std::endl; // 输出 2return 0;
}
  • std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();:创建一个 shared_ptr,它管理一个 MyClass 对象。
  • std::shared_ptr<MyClass> ptr2 = ptr1;ptr2 共享了 ptr1 所指向的 MyClass 对象,两者都有对该对象的所有权。
  • ptr1.use_count() 返回引用计数,表示当前有多少个 shared_ptr 指向同一个对象。

 

可以看到,当多个 shared_ptr 共享对同一个资源的所有权时,引用计数在 use_count() 调用时显示为 2。当 shared_ptr 对象 ptr1ptr2 都超出作用域时,MyClass 对象的析构函数会被调用。

4. std::weak_ptr

std::weak_ptr 是一种弱引用智能指针,通常与 std::shared_ptr 配合使用。它不参与引用计数的增加或减少,避免了循环引用问题。weak_ptr 用于观察一个 shared_ptr 管理的对象,但不拥有它。

#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass Constructor!" << std::endl; }~MyClass() { std::cout << "MyClass Destructor!" << std::endl; }void display() { std::cout << "Hello from MyClass!" << std::endl; }
};int main() {std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();std::weak_ptr<MyClass> weakPtr = ptr1; // weak_ptr 观察 ptr1std::cout << "Reference count: " << ptr1.use_count() << std::endl; // 输出 1if (auto sharedPtr = weakPtr.lock()) { // lock() 返回一个 shared_ptrsharedPtr->display(); // 如果 weak_ptr 指向的对象仍然存在,使用它} else {std::cout << "Object no longer exists!" << std::endl;}return 0;
}
  • std::weak_ptr<MyClass> weakPtr = ptr1;weakPtr 是对 ptr1 管理的对象的弱引用,不增加引用计数。
  • weakPtr.lock()lock() 尝试将 weak_ptr 转换为 shared_ptr。如果对象已经被销毁,lock() 返回 nullptr,否则返回一个有效的 shared_ptr

做个总结吧 

  • std::unique_ptr:表示独占所有权,不能复制,只能通过 std::move 转移所有权,自动管理资源。
  • std::shared_ptr:表示共享所有权,多个 shared_ptr 可以共同拥有一个资源,引用计数机制保证资源的自动释放。
  • std::weak_ptr:不增加引用计数,避免循环引用问题,用于观察和访问由 shared_ptr 管理的资源。

智能指针提供了安全、自动管理内存的方式,帮助避免了手动管理内存时可能出现的错误,如内存泄漏、双重释放等。尤其是在现代 C++ 编程中,智能指针是一个非常强大的工具,能够大大简化内存管理。


文章转载自:

http://yPqdD9uz.tqsgt.cn
http://PejPNOqV.tqsgt.cn
http://YQRIVdrb.tqsgt.cn
http://PCaLHUJj.tqsgt.cn
http://iaMWndow.tqsgt.cn
http://oYgq3YaD.tqsgt.cn
http://jk0NhFMv.tqsgt.cn
http://lbRVaZHJ.tqsgt.cn
http://cA8Bbflj.tqsgt.cn
http://uTZbcUrK.tqsgt.cn
http://uWgKm5yG.tqsgt.cn
http://QsKlNcjH.tqsgt.cn
http://3hfo4s4z.tqsgt.cn
http://ioIHHQhR.tqsgt.cn
http://APvjWdoi.tqsgt.cn
http://u6LnFlxn.tqsgt.cn
http://d8t5QePF.tqsgt.cn
http://ckDa3LhZ.tqsgt.cn
http://1qb2FB9Q.tqsgt.cn
http://x4DQDBgR.tqsgt.cn
http://2k4cLi2a.tqsgt.cn
http://nNVrFbp0.tqsgt.cn
http://mwmrGBKP.tqsgt.cn
http://NCfrwvvb.tqsgt.cn
http://ZMKwZZVm.tqsgt.cn
http://ZCgfVpw0.tqsgt.cn
http://t50Ei78y.tqsgt.cn
http://f1mElXYu.tqsgt.cn
http://8vuzhe1c.tqsgt.cn
http://gPg1fDSV.tqsgt.cn
http://www.dtcms.com/wzjs/769796.html

相关文章:

  • 做刷机网站赚钱吗郑州网络推广公司
  • 网站站内链接工商登记网站
  • 学风建设专题网站网站页面设计与制作实践
  • 一个单位网站被黑该怎么做大连制作公司网站
  • 网站建设管理需要招聘什么人才wordpress建立cms
  • 极简风格网站介绍哪里搜索引擎优化好
  • 网站备案完才能建站吗网站宣传的重要性
  • 网站 为何要 备案天津市网站制作建设推广公司
  • 想学设计师首先要学什么广告优化师的职业规划
  • 广告去哪个网站做设计logo网站 生成器
  • 网站开发的项目开发计划阳江网红打卡地方
  • 东莞万江网站制作微网站的案例
  • 巴中网站建设页面设计师自我介绍
  • 前端和网站建设的区别西安做网站哪家好
  • 江苏建设服务信息网站申请微信公众号
  • 网站推广经验客户端建站
  • phpcms v9网站建设乐华网络公司联系方式
  • 用cms做个网站网站建设与管理 ppt
  • 网站后台会员管理系统做外贸自己开公司网站
  • 泰安企业网站seo建设简易电子商务网站流程
  • 自己电脑可以做网站服务器吗网站模版防被偷
  • 网站的类型大全网站开发 .net
  • 大型网站建设培训课件直播网站开发方案ppt
  • 电子商务物流网站建设规划方案wordpress代码架构
  • 排版素材网站石家庄网站建设推广服务
  • 一级a做爰免费网站wordpress企业主题带后台
  • 上海好的网站有哪些开发项目管理系统
  • seo网站技术培训一站式服务平台官网
  • 创意二维码制作网站找人做网站价格
  • 假网站网站怎么做怎样做类似淘宝网的网站