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

建设网站运营方案网站模板制作

建设网站运营方案,网站模板制作,公司网站做的比较好,广州制作网站开发1.RAII 与引用计数了解 Objective-C/Swift 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。 基本想法是对于动态分配的对象#xff0c;进行引用计数#xff0c;每当增加一次对同一个对象的引用#xff0c;那么引用对象的引用计数就会增加一次…1.RAII 与引用计数了解 Objective-C/Swift 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。 基本想法是对于动态分配的对象进行引用计数每当增加一次对同一个对象的引用那么引用对象的引用计数就会增加一次 每删除一次引用引用计数就会减一当一个对象的引用计数减为零时就自动删除指向的堆内存。在传统 C 中『记得』手动释放资源总不是最佳实践。因为我们很有可能就忘记了去释放资源而导致泄露。 所以通常的做法是对于一个对象而言我们在构造函数的时候申请空间而在析构函数在离开作用域时调用的时候释放空间 也就是我们常说的 RAII 资源获取即初始化技术。凡事都有例外我们总会有需要将对象在自由存储上分配的需求在传统 C 里我们只好使用 new 和 delete 去 『记得』对资源进行释放。而 C11 引入了智能指针的概念使用了引用计数的想法让程序员不再需要关心手动释放内存。 这些智能指针包括 std::shared_ptr/std::unique_ptr/std::weak_ptr使用它们需要包含头文件 memory。注意引用计数不是垃圾回收引用计数能够尽快收回不再被使用的对象同时在回收的过程中也不会造成长时间的等待 更能够清晰明确的表明资源的生命周期。2.智能指针从比较简单的层面来看智能指针是RAII(Resource Acquisition Is Initialization资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针本质上却是一个对象这样可以方便管理一个对象的生命周期。在c中一共定义了4种类型的智能指针auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中auto_ptr 在 C11已被摒弃在C17中已经移除不可用。下文对后三种智能指针进行对比。2.1std::shared_ptrstd::shared_ptr 是一种智能指针它能够记录多少个 shared_ptr 共同指向一个对象从而消除显式的调用 delete当引用计数变为零的时候就会将对象自动删除。但还不够因为使用 std::shared_ptr 仍然需要使用 new 来调用这使得代码出现了某种程度上的不对称。std::make_shared 就能够用来消除显式的使用 new所以std::make_shared 会分配创建传入参数中的对象 并返回这个对象类型的std::shared_ptr指针。例如#includeiostream #includememory voidfoo(std::shared_ptrint i){(*i); } int main(){ // auto pointer new int(10); // illegal, no direct assignment // Constructed a std::shared_ptr auto pointer std::make_sharedint(10); foo(pointer);std::cout *pointer std::endl; // 11 // The shared_ptr will be destructed before leaving the scope return0; }std::shared_ptr 可以通过 get() 方法来获取原始指针通过 reset() 来减少一个引用计数 并通过use_count()来查看一个对象的引用计数。例如auto pointer std::make_sharedint(10); auto pointer2 pointer; // 引用计数1 auto pointer3 pointer; // 引用计数1 int *p pointer.get(); // 这样不会增加引用计数 std::cout pointer.use_count() pointer.use_count() std::endl; // 3 std::cout pointer2.use_count() pointer2.use_count() std::endl; // 3 std::cout pointer3.use_count() pointer3.use_count() std::endl; // 3pointer2.reset(); std::cout reset pointer2: std::endl; std::cout pointer.use_count() pointer.use_count() std::endl; // 2 std::cout pointer2.use_count() pointer2.use_count() std::endl; // pointer2 已 reset; 0 std::cout pointer3.use_count() pointer3.use_count() std::endl; // 2 pointer3.reset(); std::cout reset pointer3: std::endl; std::cout pointer.use_count() pointer.use_count() std::endl; // 1 std::cout pointer2.use_count() pointer2.use_count() std::endl; // 0 std::cout pointer3.use_count() pointer3.use_count() std::endl; // pointer3 已 reset; 02.2std::unique_ptrstd::unique_ptr 是一种独占的智能指针它禁止其他智能指针与其共享同一个对象从而保证代码的安全std::unique_ptrint pointer std::make_uniqueint(10); //make_unique 从C14开始引入 std::unique_ptrint pointer2 pointer; // 非法make_unique 并不复杂C11 没有提供 std::make_unique可以自行实现至于为什么没有提供C 标准委员会主席 Herb Sutter 在他的博客中提到原因是因为『被他们忘记了』。既然是独占换句话说就是不可复制。但是我们可以利用 std::move 将其转移给其他的 unique_ptr例如#includeiostream #includememorystruct Foo { Foo() { std::cout Foo::Foo std::endl; }~Foo() { std::cout Foo::~Foo std::endl; } voidfoo(){ std::cout Foo::foo std::endl; } };voidf(const Foo ){std::cout f(const Foo) std::endl; }int main(){ std::unique_ptrFoo p1(std::make_uniqueFoo()); // p1 不空, 输出 if (p1) p1-foo();{ std::unique_ptrFoo p2(std::move(p1)); // p2 不空, 输出 f(*p2); // p2 不空, 输出 if(p2) p2-foo(); // p1 为空, 无输出 if(p1) p1-foo();p1 std::move(p2); // p2 为空, 无输出 if(p2) p2-foo();std::cout p2 被销毁 std::endl;} // p1 不空, 输出 if (p1) p1-foo(); // Foo 的实例会在离开作用域时被销毁 }2.3 std::weak_ptr 如果你仔细思考 std::shared_ptr 就会发现依然存在着资源无法释放的问题。看下面这个例子struct A; struct B;struct A {std::shared_ptrB pointer;~A() {std::cout A 被销毁 std::endl;} }; struct B {std::shared_ptrA pointer;~B() {std::cout B 被销毁 std::endl;} }; int main(){ auto a std::make_sharedA(); auto b std::make_sharedB();a-pointer b;b-pointer a; }运行结果是 A, B 都不会被销毁这是因为 a,b 内部的 pointer 同时又引用了 a,b这使得 a,b 的引用计数均变为了 2而离开作用域时a,b 智能指针被析构却只能造成这块区域的引用计数减一这样就导致了 a,b 对象指向的内存区域引用计数不为零而外部已经没有办法找到这块区域了也就造成了内存泄露如下图1所示解决这个问题的办法就是使用弱引用指针 std::weak_ptrstd::weak_ptr是一种弱引用相比较而言 std::shared_ptr 就是一种强引用。弱引用不会引起引用计数增加当换用弱引用时候最终的释放流程如图 2所示在上图中最后一步只剩下 B而 B 并没有任何智能指针引用它因此这块内存资源也会被释放。std::weak_ptr 没有 * 运算符和 - 运算符所以不能够对资源进行操作它可以用于检查 std::shared_ptr 是否存在其 expired() 方法能在资源未被释放时会返回 false否则返回 true除此之外它也可以用于获取指向原始对象的 std::shared_ptr 指针其 lock() 方法在原始对象未被释放时返回一个指向原始对象的 std::shared_ptr 指针进而访问原始对象的资源否则返回nullptr。3.总结智能指针这种技术并不新奇在很多语言中都是一种常见的技术现代 C 将这项技术引进在一定程度上消除了 new/delete 的滥用是一种更加成熟的编程范式。4. 其它stackoverflow 上关于『C11为什么没有 make_unique』的讨论
http://www.w-s-a.com/news/267333/

相关文章:

  • 福州企业网站建站模板国内黑色风格的网站
  • 好看的网站首页设计android移动开发
  • 域名注册完成后如何做网站域名 删除 wordpress
  • wordpress xml导入大小东莞seo优化方案
  • 网站建设效益网站销售怎么做的
  • 利用网站空间做代理设计方案的格式范文
  • 无锡建设工程质量监督网站遵义做手机网站建设
  • 衡阳商城网站制作ps做网站首页规范尺寸
  • 微信网站应用开发营销推广的方案
  • 广州做网站商城的公司制作一个app的完整流程
  • 湖南城乡建设厅网站163注册企业邮箱
  • 做网站怎么调整图片间距织梦做的网站如何去掉index
  • 凡科网免费建站步骤及视频网页设计基础教程第二版课后答案
  • 建设一个旅游网站毕业设计企业网站要更新文章吗
  • 做网站需要简介中山网站设计公司
  • 网站怎么做导航栏微信公众号官网登录
  • 1_ 掌握网站开发的基本流程 要求:熟悉网站开发与设计的基本流程.电子商城网站开发
  • 百度网站怎么建设河北省工程造价信息网官网
  • 阿里云网站模板网页设计的合适尺寸是多少
  • 做小程序和做网站哪个好让别人做网站推广需要多少钱
  • 做外贸的几个网站查询网域名解析
  • 酒泉如何做百度的网站seo研究中心好客站
  • 网站设计建设平台户县做网站
  • 一元云购网站开发wordpress博客空间
  • 深圳高端网站建设公司排名如何搭建局域网服务器
  • 照片管理网站模板高端网站开发哪家好
  • 黄冈网站制作wordpress为什么不能显示域名
  • 做网站设计怎么进企业电子商务网站建设与管理教材
  • 设计广告公司网站建设网站开发技术选择
  • 个人网站教程个人网站有必要备案吗