面试题12c++中的智能指针: shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解

一、C++ prime plus理解

16.2 智能指针模板类 p667

智能指针模板类

  • auto_ptr< typename> valname;
  • share_ptr< typename> valname;
  • unique_ptr< typename> valname;
  • weak_ptr< typename>valname;

智能指针能够避免内存泄漏问题,在指针过期的时候会自动调用析构函数。
但是智能指针会导致一个问题,就是两个智能指针指向同一个对象时,会两次调用析构函数。
解决上述问题的方法:

  • 定义赋值运算符,使其进行深复制。
  • 建立所有权,只有一个智能指针可以拥有它,只有拥有所有权的智能指针有权删除它。然后,让赋值操作转移所有权。这就是auto_ptr和unique_ptr的方法。
  • 建立引用计数,赋值时计数+1,指针过期时计数-1。当最后一个指针过期的时候才会调用析构函数,shared_ptr。

auto_ptr和unique_ptr相同点与区别

相同点:

  1. 两者都是所有权方法。

不同点:

  1. unique_ptr在编译阶段就会报错,而auto_ptr在运行阶段报错,更安全;
  2. ???讲的有点迷茫,到时候改。

二、面试

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DALVIK THREADS (136): "Signal Catcher" daemon prio=5 tid=7 Runnable | group="system" sCount=0 dsCount=0 flags=0 obj=0x12c401a0 self=0xa85d4a00 | sysTid=944 nice=0 cgrp=default sched=0/0 handle=0x7dba8230 | state=R schedstat=( 54080844 151346 9 ) utm=2 stm=3 core=1 HZ=100 | stack=0x7daad000-0x7daaf000 stackSize=1008KB | held mutexes= "mutator lock"(shared held) native: #00 pc 00303613 /apex/com.android.runtime/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+78) native: #01 pc 003aeb4b /apex/com.android.runtime/lib/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+358) native: #02 pc 003ab193 /apex/com.android.runtime/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+34) native: #03 pc 003c3ecf /apex/com.android.runtime/lib/libart.so (art::DumpCheckpoint::Run(art::Thread*)+606) native: #04 pc 003be9bd /apex/com.android.runtime/lib/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+356) native: #05 pc 003be079 /apex/com.android.runtime/lib/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool)+1444) native: #06 pc 003bd9ef /apex/com.android.runtime/lib/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char>>&)+678) native: #07 pc 003876f3 /apex/com.android.runtime/lib/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char>>&)+130) native: #08 pc 003968a7 /apex/com.android.runtime/lib/libart.so (art::SignalCatcher::HandleSigQuit()+1026) native: #09 pc 00395cff /apex/com.android.runtime/lib/libart.so (art::SignalCatcher::Run(void*)+246) native: #10 pc 000a6077 /apex/com.android.runtime/lib/bionic/libc.so (__pthread_start(void*)+20) native: #11 pc 00060131 /apex/com.android.runtime/lib/bionic/libc.so (__start_thread+30) (no managed stack frames)
06-01

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值