C++智能指针5——自动指针auto_ptr(弃用)详解

与C++ 11不同,C++ 98标准库仅提供一个智能指针类auto_ptr,自C++ 11起不推荐使用。它的目标是提供unique_ptr现在所做的语义。

但是auto_ptr引入了一些问题:

  • 在设计时,该语言没有针对构造函数和赋值运算符的移动语义。但是,目标仍然是提供所有权转移的语义。结果,复制和赋值运算符具有移动语义,这可能导致严重的麻烦,尤其是在传递auto_ptr作为参数时。
  • 没有删除器的语义,因此您只能使用它来处理分配有new的单个对象。
  • 因为它最初是C++标准库提供的唯一智能指针,所以经常被滥用,尤其是假设它像类shared_ptr一样提供了共享所有权的语义。

关于意外失去所有权的危险,请考虑以下示例,该示例由一个普通的函数实现组成,该函数打印出auto_ptr所引用的对象:

//坏示例
template <typename T>
void bad_print(std::auto_ptr<T> p) //形参p获得传进来参数的所有权
{
    if (p.get() == NULL) {
        std::cout << "NULL";
    } else {
        std::cout << *p;
    }
} //函数退出时p将删除与其关联的对象

每当将auto_ptr传递到bad_print()时,它所拥有的对象(如果有)都将被删除,原因是将作为参数传递的auto_ptr的所有权传递给参数p,并且p在函数退出时删除其拥有的对象。 这可能不是程序员的意图,并且会导致致命的运行时错误:

std::auto_ptr<int> p(new int);
*p = 42;
bad_print(p);
*p = 18; //运行时错误

当将auto_ptr传递到容器时,该行为尤其适用。 使用unique_ptr不再可能出现这种错误,因为您必须显式地将参数传递给std::move()。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
unique_ptrC++11引入的智能指针类,定义在<memory>头文件中。它可以通过指定对象类型作为模板参数来创建。例如,unique_ptr<int>是指向int类型对象的指针,unique_ptr<double>是指向double类型对象的指针。\[1\] unique_ptr具有独占对象所有权的特点,即同一时间只能有一个unique_ptr指向一个对象,不能进行复制操作,只能进行移动操作。这意味着两个unique_ptr不能指向同一个对象。\[2\] unique_ptr还可以使用自定义的删除器(deleter),通过lambda表达式或函数指针来指定删除对象的方式。例如,在创建unique_ptr时可以指定一个lambda表达式作为删除器,用于在unique_ptr销毁时释放对象。\[3\] 总结来说,unique_ptrC++中一种独占所有权的智能指针,它提供了自动释放对象的功能,并且可以通过指定对象类型和自定义删除器来灵活地管理资源。 #### 引用[.reference_title] - *1* [C++ 智能指针unique_ptr](https://blog.csdn.net/weixin_42322256/article/details/124058138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [智能指针 unique_ptr 详解](https://blog.csdn.net/fuhanghang/article/details/113928128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值