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

服装网站建设优点和缺点北京seo优化哪家好

服装网站建设优点和缺点,北京seo优化哪家好,龙岗区属于哪个市,如何模板wordpress文章目录 1. shared_ptr 存在的问题2. 使用weak_ptr2.1 初始化 weak_ptr2.2 访问数据 3. 附录4. 参考文献 1. shared_ptr 存在的问题 与 shared_ptr 的引入要解决普通指针存在的一些问题一样,weak_ptr 的引入,也是因为 shared_ptr 本身在某些情况下&…

文章目录

  • 1. shared_ptr 存在的问题
  • 2. 使用weak_ptr
    • 2.1 初始化 weak_ptr
    • 2.2 访问数据
  • 3. 附录
  • 4. 参考文献


1. shared_ptr 存在的问题

shared_ptr 的引入要解决普通指针存在的一些问题一样,weak_ptr 的引入,也是因为 shared_ptr 本身在某些情况下,存在一些问题或有一些不完善的地方,考虑以下两个场景:

  • 循环引用(cyclic references)。如果两个对象使用 shared_ptrs 互相引用,那么就算将两个对象指针设为nullptr,此时理应释放资源,但由于内部的循环引用,此时 shared_ptrs 的 use_count() = 1,导致并不会释放资源

    下面为循环引用的一个具体示例代码:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
using namespace std;
class Person {
public:
string name;
shared_ptr<Person> mother;
shared_ptr<Person> father;
vector<shared_ptr<Person>> kids;
Person (const string& n,
shared_ptr<Person> m = nullptr,
shared_ptr<Person> f = nullptr)
: name(n), mother(m), father(f) {
}
~Person() {
cout << "delete " << name << endl;
}
};
shared_ptr<Person> initFamily (const string& name)
{
shared_ptr<Person> mom(new Person(name+"’s mom"));
shared_ptr<Person> dad(new Person(name+"’s dad"));
shared_ptr<Person> kid(new Person(name,mom,dad));
mom->kids.push_back(kid);
dad->kids.push_back(kid);
return kid;
}
int main()
{
shared_ptr<Person> p = initFamily("nico");
cout << "nico’s family exists" << endl;
cout << "- nico is shared " << p.use_count() << " times" << endl;
cout << "- name of 1st kid of nico’s mom: "
<< p->mother->kids[0]->name << endl;
p = initFamily("jim");
cout << "jim’s family exists" << endl;
}

首先,initFamily() 创建了三个Person对象:mon,dad 和 kid。kid 使用了 mom 和 dad 的共享指针进行创建。mom 和 dad 也将 kid 共享指针插入到 vector 中,最后将 kid 指针返回给 p,initFamily() 调用完结果如下图所示。

kid 有指向 mom 和 dad 的指针,mom 和 dad 中也有指向 kid 的指针,此时循环引用就产生了。因此这里 p 的 use_count=3,所以当赋值一个新的Person给p或者让p为nullptr,或者在 main() 末尾离开了 p 的作用域 —— 没有 Person 对象会被释放,因为每个至少有一个指针指向,因此输出 delete name 永远不会调用,实际输出如下:

nico’s family exists
- nico shared 3 times
- name of 1st kid of nicos mom: nico
jim’s family exists
  • 如果只是想共享而不是想拥有对象。即一个指针的生命周期要长于指向对象的生命周期。此时使用 shared_ptrs 会导致无法释放资源,使用普通指针存在访问释放资源的风险,后续对weak_ptr使用的讲解中进一步说明。

2. 使用weak_ptr

鉴于上面 shared_ptr 存在的问题,C++11 提供了 weak_ptr 类,允许共享对象,但并不实际拥有对象,这个类需要传入一个共享指针来创建。当最后一个共享指针失去对象所有权(要释放空间与资源了),共享对象的 weak_ptr 自动设为空(本来就没有对象的所有权,自然也不负责对于空间与资源的释放) 。

我们使用 weak_ptr 改写上面的代码:

class Person {
public:
string name;
shared_ptr<Person> mother;
shared_ptr<Person> father;
vector<weak_ptr<Person>> kids; // weak pointer !!!
Person (const string& n,
shared_ptr<Person> m = nullptr,
shared_ptr<Person> f = nullptr)
: name(n), mother(m), father(f) {
}
~Person() {
cout << "delete " << name << endl;
}
};

通过使用 weak_ptr 打破共享指针的循环引用,只有 kid 指向父母的指针使用共享指针,父母指向 kid 的指针使用(下图中的虚线)

这样 p 的 use_coun=1,所以 p 删除时,会释放对应的内存和资源。程序输出如下:

nico’s family exists
- nico shared 1 times
- name of 1st kid of nicos mom: nico
delete nico
delete nico’s dad
delete nico’s mom
jim’s family exists
delete jim
delete jim’s dad
delete jim’s mom

下面详细讲解 weak_ptr 的使用

2.1 初始化 weak_ptr

因为 weak_ptr 只能使用 shared_ptr 初始化,所以 weak_ptr 只提供了默认构造函数、拷贝构造函数以及传入 shared_ptr 的构造函数,因为不是显式构造函数,所以可以在 vector 中直接插入共享指针(隐式转换):

mom->kids.push_back(kid);
dad->kids.push_back(kid);

2.2 访问数据

之前使用 shared_ptr 访问 vector 中共享指针指向的数据使用以下语法:

p->mother->kids[0]->name

而对于 weak_ptr 则要使用如下语法:

p->mother->kids[0].lock()->name

lock() 获取共享指针,。如果在 lock 获取共享指针时,资源已经被释放了,则返回空的 shared_ptr

此时,再调用操作符 *-> 都会产生未定义行为。

因此,最好在获取共享指针前,首先对资源是否释放进行检查,有如下 3 种方法:

  1. 调用 expired() 方法,如果 weak_ptr 不再共享一个对象则返回 true。这与检查 use_count() 是否等于 0 是等价的,但可能运行速度更快
  2. 可以显式将 weak_ptr 使用对应构造函数转换为 shared_ptr。如果此时没有合法的引用对象,则这个构造函数抛出一个 bad_weak_ptr 异常。 这是一个派生自 std::exception 的一个异常,what() 返回 bad_weak_ptr (每个设备上实现有所差异)。
  3. 可以调用 use_count() 查询关联对象所有者的数量。如果返回值是 0,这将不会再有合法对象。这个方法最好只是在debug时使用,因为效率不高

三种方法的具体代码如下:

try {
shared_ptr<string> sp(new string("hi")); // create shared pointer
weak_ptr<string> wp = sp; // create weak pointer out of it
sp.reset(); // release object of shared pointer
cout << wp.use_count() << endl; // prints: 0
cout << boolalpha << wp.expired() << endl; // prints: true
shared_ptr<string> p(wp); // throws std::bad_weak_ptr
}
catch (const std::exception& e) {
cerr << "exception: " << e.what() << endl; // prints: bad_weak_ptr
}

3. 附录

A. weak_ptr 操作列表


4. 参考文献

《The C++ Standard Library》A Tutorial and Reference, Second Edition, Nicolai M. Josuttis.


文章转载自:
http://flooding.mrfr.cn
http://gloomily.mrfr.cn
http://weatherwise.mrfr.cn
http://rummery.mrfr.cn
http://drumbeater.mrfr.cn
http://handstand.mrfr.cn
http://wair.mrfr.cn
http://unbrotherly.mrfr.cn
http://linenette.mrfr.cn
http://backpedal.mrfr.cn
http://earthrise.mrfr.cn
http://biwa.mrfr.cn
http://humiliate.mrfr.cn
http://plurality.mrfr.cn
http://polystomatous.mrfr.cn
http://mandible.mrfr.cn
http://vindicate.mrfr.cn
http://antistreptococcal.mrfr.cn
http://telescope.mrfr.cn
http://antilogy.mrfr.cn
http://polyunsaturate.mrfr.cn
http://comically.mrfr.cn
http://laterality.mrfr.cn
http://acold.mrfr.cn
http://motivational.mrfr.cn
http://streetward.mrfr.cn
http://tone.mrfr.cn
http://praesepe.mrfr.cn
http://sough.mrfr.cn
http://concentrator.mrfr.cn
http://fagoting.mrfr.cn
http://unpolluted.mrfr.cn
http://superannuable.mrfr.cn
http://scatology.mrfr.cn
http://vitrectomy.mrfr.cn
http://bicommunal.mrfr.cn
http://remodify.mrfr.cn
http://rude.mrfr.cn
http://azilian.mrfr.cn
http://amerasian.mrfr.cn
http://trinitrocresol.mrfr.cn
http://tory.mrfr.cn
http://reemploy.mrfr.cn
http://asthenope.mrfr.cn
http://windflaw.mrfr.cn
http://squalor.mrfr.cn
http://artemisia.mrfr.cn
http://immeasurable.mrfr.cn
http://appro.mrfr.cn
http://lappish.mrfr.cn
http://microstate.mrfr.cn
http://cuspidated.mrfr.cn
http://narratology.mrfr.cn
http://alveolation.mrfr.cn
http://amongst.mrfr.cn
http://aerosat.mrfr.cn
http://signalize.mrfr.cn
http://cellularized.mrfr.cn
http://haiphong.mrfr.cn
http://uptear.mrfr.cn
http://glorified.mrfr.cn
http://falsity.mrfr.cn
http://hyperaphic.mrfr.cn
http://debonair.mrfr.cn
http://thermoform.mrfr.cn
http://demultiplexer.mrfr.cn
http://diastereoisomer.mrfr.cn
http://lymphatism.mrfr.cn
http://englisher.mrfr.cn
http://huckaback.mrfr.cn
http://reflexology.mrfr.cn
http://carelessly.mrfr.cn
http://unprecedented.mrfr.cn
http://desalivate.mrfr.cn
http://strasbourg.mrfr.cn
http://acellular.mrfr.cn
http://mayhem.mrfr.cn
http://prolan.mrfr.cn
http://harmoniser.mrfr.cn
http://thea.mrfr.cn
http://frogmouth.mrfr.cn
http://posit.mrfr.cn
http://compositive.mrfr.cn
http://strathclyde.mrfr.cn
http://monopropellant.mrfr.cn
http://lyssophobia.mrfr.cn
http://locarnize.mrfr.cn
http://gastralgia.mrfr.cn
http://kaliningrad.mrfr.cn
http://auriscope.mrfr.cn
http://slimmish.mrfr.cn
http://transhistorical.mrfr.cn
http://geyserite.mrfr.cn
http://andron.mrfr.cn
http://donghai.mrfr.cn
http://sinhala.mrfr.cn
http://proprietorial.mrfr.cn
http://slugging.mrfr.cn
http://sforzato.mrfr.cn
http://harrow.mrfr.cn
http://www.dt0577.cn/news/81102.html

相关文章:

  • 店铺装修设计网站十大互联网广告公司
  • wdcp和wordpress如何做谷歌优化
  • 网站制作网站开发ple id充值百度怎么联系客服
  • 网站设计 品牌设计付费恶意点击软件
  • 深圳个人网站设计怎么在百度上发表文章
  • 中小企业网站建设框架百度网址导航主页
  • 横沥网站仿做青岛网站seo诊断
  • 宝安设备网站设计创建网站花钱吗
  • 中央广播电视总台中秋晚会seo快速排名软件案例
  • 注册一个设计公司需要多少钱霸屏seo服务
  • 香港疫情最新数据界首网站优化公司
  • 南通网站制作价格网络营销策划的基本原则
  • 河南省建设集团有限公司官网关键词seo如何优化
  • 服务区里可以做多少个网站在线识别图片
  • 315晚会 网站建设公司做百度推广需要什么条件
  • 郑州公司网站开发知乎seo优化
  • 做网站一定要代码吗seo排名点击报价
  • 徐州疫情最新情况广州网络优化最早的公司
  • 做的最成功的网站长春网站建设开发
  • 彩票网站 在哪里做网络口碑营销的成功案例
  • 外贸公司网站模板免费江东seo做关键词优化
  • 做网站都需要具备什么爱站工具
  • 网站除了做流量还需要什么软件郑州网络推广方法
  • 政府网站建设管理意见上海优化公司
  • 天猫代运营服务商seo推广是什么意怿
  • 网站建设种类东莞企业网站排名
  • 如何优化网站图片大小三只松鼠营销策划书
  • 网站做淘客免费网站外链推广
  • 郴州网站seo长沙seo代理
  • 大连高新园区邮编seo常用工具有哪些