首页 / C++ / c++智能指针介绍之auto_ptr
c++智能指针介绍之auto_ptr
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++智能指针介绍之auto_ptr,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2089字,纯文字阅读大概需要3分钟。
内容图文
![c++智能指针介绍之auto_ptr](/upload/InfoBanner/zyjiaocheng/740/eda2e455fd6d4f3ea37906e6e55f08e7.jpg)
c++智能指针介绍之auto_ptr
- c++98: auto_ptr, 包含头文件为
<memory>
里, c++11 弃用,unique_ptr
代之
auto_ptr
作用及特性:
- 智能指针的引用,主要是为了解决异常发生时产生内存泄漏。
- auto_ptr在创建的时候获取对象的所有权,在析构的时候,释放对象内存空间(RAII1)。
- 重载了函数的
*
和->
运算符,使得其操作看起来像个内置指针。 - 没有使用引用计数,在复制构造或赋值的时候发生所有权转移
包含的操作:
- 拷贝构造、赋值操作:
auto_ptr(auto_ptr& __a) throw() : _M_ptr(__a.release()) { }
auto_ptr& operator=(auto_ptr& __a) throw()
{
reset(__a.release());
return *this;
}
- reset/release/get
void reset(element_type* __p = 0) throw()
{
if (__p != _M_ptr) { // 防止自身赋值
delete _M_ptr; // 删除原来的内容
_M_ptr = __p;
}
}
element_type* release() throw()
{
element_type* __tmp = _M_ptr;
_M_ptr = 0; // 放弃原来的所有权
return __tmp; // 将所有权返回
}
element_type* get() const throw() { return _M_ptr; }
- 构造/析构:构造函数是
explicit
的,不能隐式转换
explicit auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
// int *p = new int(1); auto_ptr<int> ap = p; 错误,不能隐式转换
~auto_ptr() { delete _M_ptr; }
缺点:
- 删除方式,默认是
delete
,如果保存的指针指向的是数组,则应使用delete[]
才能正确释放
int *arr = new int[100];
auto_ptr<int> ap(arr); // 析构函数中删除对象使用delete而不是delete[],所以auto_ptr不能用来管理数组指针
- 当对一个auto_ptr执行拷贝构造和赋值运算时,对象所有权被转移,再执行读写操作时会有问题;同时对于原始指针不能再做释放操作
int *p = new int(1);
auto_ptr<int> ap(p);
auto_ptr<int> ap2 = ap;
*ap = 3; // 错误,对象所有权已经转移
- 不能讲auto_ptr对象存储在容器中,因为容器中的元素默认是支持拷贝、赋值操作的。
vector<auto_ptr<int> > vx; // 错误,容器中保存auto_ptr实例是不被允许的
- 应该避免多个auto_ptr指向同一个原始指针,这样会重复析构
int *p = new int(1);
auto_ptr<int> ap1(p);
auto_ptr<int> ap2(p); // 析构的时候会重复delete p
- 不能保存静态类型,因为auto_ptr析构的时候释放内存,发生释放非动态申请到的内存情况。
int a = 2; auto_ptr<int> ap(&a); // ap析构是发生错误
Resource Acquisition is Initialization, 资源获取即初始化,也就是说,在控制资源生命周期的时候,在某个对象初始化(构造)的时候获取资源,而在对象销毁的时候析构。 ??
内容总结
以上是互联网集市为您收集整理的c++智能指针介绍之auto_ptr全部内容,希望文章能够帮你解决c++智能指针介绍之auto_ptr所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。