C++ 11 智能指针

智能指针在头文件<memory>中定义。共包含4种:auto_ptr、unique_ptr、share_ptr以及weak_ptr。
auto_ptr在C++98中定义,在C++11中引入unique_ptr后推荐使用unique_ptr替代auto_ptr。
一、unique_ptr
指针指向的内存空间不与其他指针共享。但可通过移动语义将所有权转移给其他的unique_ptr。
无法将一个unique_ptr赋值给另一个unique_ptr
unique_ptr<UniqueTest> up1 = new UniqueTest(5); // 报错
无法使用一个unique_ptr构造另一个unique_ptr
unique_ptr<UniqueTest> up2cp(up2); // 报错
无法将unique_ptr作为函数参数
int GetVal(unique_ptr<int> ptr)
{
    return *ptr;    
}

GetVal(up4); // 报错

可以使用make_unique构造unique_ptr(C++ 14中支持)
unique_ptr<UniqueTest> up3 = make_unique<UniqueTest>(3); // 使用make_unique, C++ 14支持
支持通过std::move将一个unique_ptr对对象的所有权转移给另一个unique_ptr。原unique_ptr将被置为空指针。
unique_ptr<UniqueTest> up3 = make_unique<UniqueTest>(3); // 使用make_unique, C++ 14支持
unique_ptr<UniqueTest> up3move(std::move(up3));
支持*,->操作,但不支持++、—操作。
unique_ptr<UniqueTest> up5(new UniqueTest(5));
// 通过*访问元素
unique_ptr<int> ip5(new int(5));
printf("ip5 value is %d\n", *ip5);
// 通过->访问元素
printf("up5 value is %d\n", up5->m_val);
可以从函数中返回一个unique_ptr
unique_ptr<UniqueTest> GetUnique()
{
return unique_ptr<UniqueTest>(new UniqueTest(m_val));
}
可以在容器中保存unique_ptr
// 在容器中保存unique_ptr
vector<unique_ptr<int>> ptrVec;
ptrVec.push_back(make_unique<int>(1));
ptrVec.push_back(make_unique<int>(2));
ptrVec.push_back(make_unique<int>(3));
auto itBegin = ptrVec.begin();
auto itEnd = ptrVec.end();
for (; itBegin != itEnd; ++itBegin)
{
printf("ptrVec is %d\n", **itBegin);
}
可以使用unique_ptr管理动态数组
//初始化数组
unique_ptr<int[]> pArry(new int[5]{1,2,3,4,5});
for (int i = 0; i < 5; ++i)
{
    printf("arry[%d] is %d\n", i, pArry[i]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值