189 8069 5689

2022.12.1pm-创新互联

【C++ Primer】

创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的望江网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

shared_ptr

除了make_shared那种方法(make_shared更好),还可以用new返回的指针来初始化智能指针,例如shared_ptrp (new int(42)); 但是我们不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式来初始化一个智能指针,例如shared_ptrp1 = new int(1024); 这种方法就是错误的,不可以进行内置指针到智能指针之间的隐式转换。

reset函数有三种,p.reset(),p.reset(q),p.reset(q, d)。如果p是唯一指向其对象的shared_ptr,那么reset会释放此对象。如果传递了一个内置指针q,会令p指向q,否则会将p置为空。若还传递了参数d,将会调用d而不是delete来释放q。前面说了不能将一个内置指针赋予shared_ptr,但用reset将一个新的指针赋予一个shared_ptr是可以的,比如p.reset(new int(1024));

不要混用普通指针和智能指针,使用一个内置指针来访问一个智能指针所负责的对象是很危险的,因为我们不知道对象何时会被销毁。

unique_ptr

某个时刻只能有一个unique_ptr指向一个给定对象,当unique_ptr被销毁时,它所指向的对象也被销毁。定义方法:unique_ptrp2(new int(42)); 要采用直接初始化形式。

u.release()表示u放弃对指针的控制权,返回指针,并将u置为空。

u.reset()表示释放u指向的对象,如果提供了内置指针如u.reset(q),则令u指向这个对象,否则将u置为空。虽然我们不能拷贝或赋值unique_ptr,但可以通过调用release或reset将指针的所有权从一个(非const)unique_ptr转移给另一个unique_ptr,例如:

unique_ptrp1(new string("hello"));

unique_ptrp2(p1.release()); // release将p1置为空,然后将原本p1对指针(指向"hello")的所有权转移给p2

unique_ptrp3(new string("hi"));

p2.reset(p3.release()); // reset释放了p2原来指向的对象(也就是"hello"),然后把p3对指针(指向"hi")的所有权转移给p2

weak_ptr

是一种不控制所指对象生存期的智能指针,它指向一个shared_ptr管理的对象。创建一个weak_ptr时是用一个shared_ptr来初始化它,创建的weak_ptr不会改变shared_ptr的引用计数,weak_ptr指向的对象可能被释放掉。由于对象可能不存在,所以我们不能使用weak_ptr直接访问对象,而必须调用lock(),此函数检查weak_ptr指向的对象是否仍存在,如存在,返回一个指向共享对象的shared_ptr。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:2022.12.1pm-创新互联
URL链接:http://cdxtjz.cn/article/ddpeps.html

其他资讯