auto_ptr、scoped_ptr、unique_ptr 分析

c++ 动态指针的一些问题 #

 

这事涉及资源所有权的问题。scoped_ptr,auto_ptr都是表达唯一所有权持有者的,区别在于,scoped_ptr的所有权是从一而终的,auto_ptr则允许用户以很自然的方式转交资源。两者的设计理念都保证同一时刻所有权持有者唯一。

auto_ptr的好处是显而易见的。比如你在用vector保存智能指针时,由于大量元素操作必须涉及资源转移,scoped_ptr完全没法用。然而其设计上的最大问题在于让一切赋值行为变成了资源转交。这一点不符合最小惊讶原则,你很难一上来就接受原件被“拷贝”以后会失效这件事。所以C++11使用unique_ptr代替auto_ptr,除非在自身即将消亡的时候,资源的转交只能通过另一成员release显式完成。

总而言之,auto_ptr最大的弊端在于允许很多几乎没有实际用处又不符合常规认知的行为,用scoped_ptr和unique_ptr可以利用静态检查早早地指出这些无意义操作的存在。

auto_ptr采用copy语义来转移指针资源,转移指针资源的所有权的同时将原指针置为NULL,这跟通常理解的copy行为是不一致的(不会修改原数据),而这样的行为在有些场合下不是我们希望看到的。

例如参考《Effective STL》第8条,sort的快排实现中有将元素复制到某个局部临时对象中,但对于auto_ptr,却将原元素置为null,这就导致最后的排序结果中可能有大量的null。

而现在C++11的对move语义的支持,使得这样的资源转移通常只会在必要的场合发生,例如转移一个临时变量(右值)给某个named variable(左值),或者一个函数的返回(右值)

这也就是用unique_ptr代替auto_ptr的原因,本质上来说,就是unique_ptr禁用了copy,而用move替代。

之所以说通常,是因为,也可以用std:move来实现左值move给左值,例如:

std::unique_ptr<bar> b0(new bar());

std::unique_ptr<bar> b1(std::move(b0));

What C++ Smart Pointer Implementations are available?

多个auto_ptr不能管理同一片内存, 执行=的时候,就把原来的auto_ptr给干掉。

其实从逻辑上来讲,如果多个auto_ptr管理同一块内存肯定有问题。

第一个auto_ptr析构的时候就应该把内存释放掉了,

第二个auto_ptr再析构的时候,就要去释放已经被释放的内存了, 程序肯定挂掉。

后记:

const & ,是无法修改的,必须用&。为什么释放呢

如果不这样设计,而是直接把参数的_M_ptr指针赋值给自己的, 那么两个auto_ptr的_M_ptr指向同一块内存,

在析构auto_ptr的时候就会出问题: 假如两个auto_ptr的_M_ptr指针指向了同一块内存,

那么第一个析构的那个auto_ptr指针就把_M_ptr指向的内存释放掉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值