C++ auto_ptr智能指针
2023-09-11 14:22:29 时间
前言
auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:不是C++11标准中定义的,且这只是一种简单的智能指针)。使用auto_ptr主要是为了防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。
1. auto_ptr智能指针使用
1.1 auto_ptr智能指针初始化
#include <memory>
//标准构造函数初始化
std::auto_ptr<int> p_auto1(new int(1024));
cout << "p_auto1 value is:" << *p_auto1 << endl;
//操作符‘=’初始化
std::auto_ptr<int> p_auto2(new int(2048));
std::auto_ptr<int> p_auto3 = p_auto2;
cout << "p_auto3 value is:" << *p_auto1 << endl;
1.2 auto_ptr重置reset()
这是其操作符定义:
void reset (X* p=0) throw();
从代码可以看出函数为reset()函数提供了默认的参数,要是没有带入参数进来的话,就将指针的值赋值为NULL(0)。也可以传入一个新的指针,像这样
auto_p1.reset (new int);
*auto_p1=5;
std::cout << *auto_p1 << '\n';
1.3 auto_ptr销毁
auto_ptr的销毁是这样的定义的,销毁的时候会返回指针指向的对象
X* release() throw();
在下面的测试代码中输出的结果会是2048
int* p_int = p_auto3.release();
cout << "p_int value:" << *p_int << endl;
2. auto_ptr使用注意事项
2.1 操作符=
当进行赋值操作的时候
std::auto_ptr<int> p_auto2(new int(2048));
std::auto_ptr<int> p_auto3 = p_auto2;
p_auto2转移所有权,因此之后在对p_auto2取值的时候就会报错,可以通过get函数来查看当前的指针,就会发现当前的指针已经为nullptr了
2.2 不要误用auto_ptr
(1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。
(2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。
(3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr。
(4)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权
相关文章
- C++模板之可变模板参数
- C/C++知识要点5——智能指针原理及自己定义实现
- 小米面试——C++开发岗位
- 【C++】线程
- C++基本知识点
- C/C++ ini配置文件的格式及如何读写ini配置文件
- 开源免费的C/C++网络库(c/c++ sockets library)补充
- [C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
- 《C++ AMP:用Visual C++加速大规模并行计算》——第3章 C++ AMP基础
- C++ 智能指针最佳实践&源码分析
- C++学习之交互式表达式求值的详细讲解和简单代码示例
- c++从文件中读取一行数据并保存在数组中
- C++ 内存管理与智能指针
- 理清gcc、libc、libstdc++的关系(libstdc++是gcc搞的,libc++是llvm搞的,他们都是C++标准库的实现)
- C++11 新特性之智能指针(shared_ptr, unique_ptr, weak_ptr)
- C++ ------ 创建对象 new 和不 new 的区别
- 真想用c#开发个 wp五笔输入法。。。奈何网上资料太少,源码都是c++写的。求大神指点!!!
- 仿真算法数据结构与算法 C++实现
- C/C++教程 第二十七章 —— 脚本开发
- C++11 shared_ptr共享智能指针