[c++基础] 智能指针

设计原理:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。

auto_ptr

 

则C++会把m_example所指向的内存回收,使m_example1 的值为NULL,所以在C++中,应绝对避免把auto_ptr放到容器中。即应避免下列代码:

vector<auto_ptr<MyClass>>m_example;

当对容器操作的时候,赋值传递会使容器中多个元素被置为NULL,而这不是我们想看到的。


unique_ptr

避免了指针指向有效数据的问题,会出现编译错误提示,即:

unique_ptr<string> pu1(newstring ("hello world"));

unique_ptr<string> pu2;

pu2 = pu1;      // not allowed

unique_ptr<string>pu3;

pu3= unique_ptr<string>(new string("Yo!"));  //allowed

 

将一个unique_ptr赋给另一个时,如果源unique_ptr是个临时右值,编译器允许这样做;如果源unique_ptr将存在一段时间,编译器将禁止这样做

还可以用std::move()将一个unique_ptr赋给另一个

unique_ptr<string> ps1, ps2;
ps1 = demo("hello");
ps2 = move(ps1);
ps1 = demo("alexia");
cout << *ps2 << *ps1 << endl;
另外, 可将unique_ptr存储到STL容器,只要不调用将一个unique_ptr复制或赋给另一个的相关算法(如sort()


shared_ptr

Shared_ptrauto_ptr最大的区别就是,shared_ptr解决了指针间共享对象所有权的问题,也就是auto_ptr中的赋值的奇怪问题。所以满足了容器的要求,可以用于容器中。

 


传送门

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值