- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第
C++面试八股文之智能指针详解
某日二师兄参加XXX科技公司的C++工程师开发岗位第19面:
面试官:什么是智能指针?
二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请、释放资源,所以称为智能指针。
面试官:C++11引入了哪些智能指针?
二师兄:三种,分别是shared_ptr、unique_ptr、和weak_ptr。
面试官:说一说三种指针的特征及用途。
二师兄:好的。shared_ptr使用了引用计数(usecount)技术,当复制个shared_ptr对象时,被管理的资源并没有被复制,而是增加了引用计数。当析构一个shared_ptr对象时,也不会直接释放被管理的的资源,而是将引用计数减一。当引用计数为0时,才会真正的释放资源。shared_ptr可以方便的共享资源而不必创建多个资源。
二师兄:unique_ptr则不同。unique_ptr独占资源,不能拷贝,只能移动。移动过后的unique_ptr实例不再占有资源。当unique_ptr被析构时,会释放所持有的资源。
二师兄:weak_ptr可以解决shared_ptr所持有的资源循环引用问题。weak_ptr在指向shared_ptr时,并不会增加shared_ptr的引用计数。所以weak_ptr并不知道shared_ptr所持有的资源是否已经被释放。这就要求在使用weak_ptr获取shared_ptr时需要判断shared_ptr是否有效。
structBoo;
structFoo{
std::shared_ptrBooboo;
structBoo{
std::shared_ptrFoofoo;
};
二师兄:Foo中有一个智能指针指向Goo,而Goo中也有一根智能指针指向Foo,这就是循环引用,我们可以使用weak_ptr来解决这个文通。
Booboo;
autofoo=boo.foo.lock();
if(foo)
//这里通过获取到了foo,可以使用
}else
//这里没有获取到,不能使用
}
面试官:好的。智能指针是线程安全的吗?
二师兄:是的。抛开类型T,智能指针是类型安全的。
面试官:为什么?
二师兄:因为智能指针底层使用的引用计数是atomic的原子变量,原子变量在自增自减时是线程安全的,这保证了多线程读写智能指针时是安全的。
面试官:好的。为什么尽量不要使用裸指针初始化智能指针?
二师兄:因为可能存在同一个裸指针初始了多个智能指针,在智能指针析构时会造成资源的多次释放。
面试官:为什么不要从智能指针中返回裸指针呢?
二师兄:是因为如果返回的裸指针被释放了,智能指针持有的资源也失效了,对智能指针的操作是未定义的行为。
面试官:智能指针能够持有数组吗?
二师兄:shread_ptr和unique_ptr都可以持有数组。
面试官:那你知道在释放资源的时候两者有什么不同吗?
二师兄:这个暂时还不清楚。。
面试官:可以使用静态对象初始化智能指针吗?
二师兄:让我想想。。不可以,因为静态对象的生命周期和进程一样长,而智能指针的析构的时候会导致静态资源被释放。这会导致未定义的行为。
面试官:如果需要在一个类中实现一个方法,这个方法返回这个类的shread_ptr实例,需要注意哪些东西?
二师兄:需要继承std::enable_shared_from_this类,方法返回shared_from_this()。
structFoo:publicstd::enable_shared_from_thisFoo
std::shared_ptrFooget_foo()
returnshared_from_this();
};
面试官:为什么不直接返回this指针?
二师兄:额。。。不太清楚,但是这应该是个范式。
面试官:好的,今天的面试结束了,请回去等通知吧。
今天二师兄的表现不错,让我们看看一些回答的不太理想的地方吧。
智能指针是线程安全的吗?
很遗憾,使用不当的时候并不是。
#includeiostream
#includememory
#includethread
#includechrono
structFoo
Foo(inti):i_(i){}
voidprint(){std::couti_std::endl;}
inti_;
文档评论(0)