智能指针 auto_ptr

C11标准中的四个智能指针:

  1. auto_ptr (已弃用)
  2. unique_ptr
  3. shared_ptr
  4. weak_ptr

auto_ptr

构造函数与析构函数

int* p = new int(0);
auto_ptr<int> ap(p);

1.两个auto_ptr,不能同时拥有一个对象。(会重复删除)

int *p =new int (0);
auto_ptr<int> ap1(p);
auto_ptr2<int>ap2(2);
/*因为ap1与ap2都认为指针p是归它管的,
在析构时都试图删除p,
两次删除同一个对象的行为在C++标准中是未定义的。
所以我们必须防止这样使用auto_ ptr。*/

2.不能用auto_ptr 管理数组指针。(析构是delete,不是delete[])

String *p = new String[10];
auto_ptr<String> ap(p);

3.构造函数的explicit关键词有效阻止从一个“裸”指针隐式转换成auto_ ptr 类型。

拷贝构造与赋值

1.因为一个auto_ ptr 被拷贝或被赋值后,其已经失去对原对象的所有权,这个时候,对这个auto_ ptr 的提领(dereference )操作是不安全的。
如下:

int * p= new int(0);
auto_ ptr<int> ap1(p);
auto_ ptr<int> ap2 = ap1;
cout<< *ap1;//错误, 此时ap1 已失去对p指针的拥有权,

2.auto_ptr 不具有值语义,所以不能被用在STL标准容器中。

3.提领操作(dereference)
提领操作有两个操作,一个是返回其所拥有的对象的引用,另一个则是实现了通过auto_ptr 调用其所拥有的对象的成员。
如:

class Base
{
void fun() {};
}
auto_ _ptr<A> ap (new Base());
(*ap). fun();
ap->fun( );

4.辅助函数

  1. get用来显式的返回auto_ ptr 所拥有的对象指针。我们可以发现,标准库提供的auto_ ptr 既不提供从裸指针至
    auto
    ptr 的隐式转换(构造函数为explicit),也不提供从auto_ _ptr 到"裸"指针的隐式转换,从使用上来讲可能不那么的灵
    活,考虑到其所带来的安全性还是值得的。
  2. release ,用来转移所有权。
  3. reset,用来接收所有权,如果接收所有权的auto_ ptr 如果已经拥有某对象,必须先释放该对象。
    5使用auto_ ptr 的注意事项
    (1) auto
    ptr不能指向数组
    (2) auto_ ptr 不能共享所有权
    (3) auto
    ptr 不能通过复制操作来初始化
    (4) auto
    ptr 不能放入容器中使用
    (5) auto
    _ptr 不能作为容器的成员

图论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值