为什么 auto_ptr 在 C++ 中被弃用
TLDR; 很久之前看到auto_ptr就觉得挺好,和auto一样,反正不用自己管,C++会自动推导智能指针的类型。不过这个关键字已经在C++ 11中被弃用/deprecated。
弃用与移除
std::auto_ptr在 C++ 11 中被弃用。- 在 C++ 17 中被完全移除。
为什么 auto_ptr 被弃用?
- 它具有不安全的拷贝语义/copy semantics。
- 拷贝一个
auto_ptr会转移所有权,并将原指针设为nullptr。 - 这种行为很容易引发 bug,尤其是在标准容器或算法中使用时。
std::auto_ptr<int> p1(new int(42));
std::auto_ptr<int> p2 = p1; // 所有权被转移
std::cout << *p2 << std::endl; // 正常
std::cout << *p1 << std::endl; // 未定义行为(p1 变成 nullptr)
应该使用什么替代?
std::unique_ptr—— 独占所有权std::shared_ptr—— 共享所有权
#include <memory>
#include <iostream>
int main() {
std::unique_ptr<int> p1(new int(42));
std::unique_ptr<int> p2 = std::move(p1); // 转移所有权
std::cout << *p2 << std::endl;
}
对比表
| 特性 | std::auto_ptr |
std::unique_ptr |
|---|---|---|
| 可拷贝性 | 是(但不安全) | 否 |
| 移动语义 | 否 | 是 |
| 引入/移除 | C++98 / C++17 中移除 | C++11 引入 |
结论
在现代 C++ 中,使用 std::unique_ptr 或 std::shared_ptr 进行内存管理。不要在新的项目中再使用 auto_ptr。
C/C++编程
- 理解C++中的std::transform_reduce及示例
- 使用原子 TAS 指令实现自旋锁
- C++中检测编译时与运行时: if consteval 与 std::is_constant_evaluated()
- C++ 转发引用: 完美转发的关键
- 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型
- C与C++: restrict关键字及其在编译器优化中的作用
- C++的左值/lvalue, 右值/rvalue和右值引用/rvalue references
- C++中的assert和static_assert的区别
- C++: auto_ptr智能指针被弃用
- C++中的consteval是什么? 它与const和constexpr有何不同?
- C++ 教程: 用std::move来移动所有权
- C++中的 const和constexpr 比较
- 简易教程: C++的智能指针
- C++ 编程练习题: 如何合并两个二叉树?
- C++ 编程练习题 - 找出第三大的数
- C++ 编程练习题 - 最多连续的 1
- C++ 编程练习题 - 左子树叶节点之和 (深度优先+广度优先+递归)
- C++ 编程练习题 - 最多水容器 (递归)
- C++的异步编程: std::future, std::async 和 std::promise
- C编程练习题: 翻转整数位
- C++编程练习题: 找出字符串的所有大小小组合
- C/C++ 中的内存管理器(堆与栈)
- C++编程练习题: 对两单向链表求和
英文:Why auto_ptr is Deprecated in C++?
本文一共 236 个汉字, 你数一下对不对.上一篇: 通过脚本让电脑实现模拟按键(一直在线功能): VBScript/JScript/PowerShell
下一篇: C++中的assert和static_assert的区别
扫描二维码,分享本文到微信朋友圈