auto_ptr类
auto_ptr是一个模板类,用于管理动态内存分配。
请看下面的函数:
void remodel (string& str)
{
string * ps = new string(str);
...
str = *ps;
return;
}
上述代码存在这样一个缺陷:没有收回函数中分配的内存。
解决方法:在return前加上delete,如下所示:
void remodel (string& str)
{
string * ps = new string(str);
...
str = *ps;
delete ps;
return;
}
上述解决方法并不是最佳的,因为编程者有时可能忘了,有时可能在不经意间删除或注释掉了这些代码。而且即使没有这些问题,也可能有其他问题。如:
void remodel (string& str)
{
string * ps = new string(str);
...
if (weird_thing())
throw exception();
str = *ps;
delete ps;
return;
}
在上述代码中,当出现异常时,delete将不被执行,因此将导致内存泄露。
解决方法:如果一个指针对象,那么可以在对象过期时,让它的析构函数删除被指向的内存。这就是auto_ptr背后的思想。
auto_ptr的头文件为<memory>
使用方法:
auto_ptr<double>pd(new double);
auto_ptr<string>ps(new string);
上述函数经修改后如下所示:
void remodel (string& str)
{
auto_ptr<string>ps (new string(str));
...
if (weird_thing())
throw exception();
str = *ps;
return;
}
注意:auto_ptr的构造函数是显式的,这意味着不存在从指针到auto_ptr对象的隐式类型转换:
auto_ptr<double>pd;
double *p_reg = new double;
pd = p_reg; //not allowed
p_reg = pd; //not allowed
pd = auto_ptr<double>(p_reg);//allowed
auto_ptr<double>pauto(p_reg);//allowed
注意事项:
- 只能对new分配的内存使用auto_ptr对象,而不要对由new[]分配的或通过声明变量分配的内存使用它。
- 由于auto_ptr被销毁时会自动删除它所指之物,所以不能让多个auto_ptr同时指向同一对象,以避免对象被删除一次以上。为了预防这个问题,auto_ptr有一个不寻常的性质:若通过copy构造函数或copy assignment操作符赋值它们,它们会变成null,而复制得到的指针将取得资源的唯一所有权。
PS:
由于auto_ptr的复制行为的特殊性,因此引入了“引用计数型智慧指针”(reference-counting smart pointer;RCSP)。RCSP也是个智能指针,可以持续追踪共有多少对象指向某个资源,并在无人指向它时自动删除该资源。但是它无法打破环状引用(例如两个其实已经没被使用的对象彼此互值,因而好像还在“被使用”状态)。
TR1的tr1::shared_ptr就是个RCSP
auto_ptr类的更多相关文章
- 用auto_ptr类模板帮助动态内存管理
动态内存使用最多的是在C++应用程序的代码中.有过编程经验的程序员虽然都知道new操作符的使用一定要与delete匹配,在某些场合仍然可能有内存溢出.当异常被掷出时,程序的正常控制流程被改变,因此导致 ...
- C++ 智能指针auto_ptr
template<class T> class auto_ptr { public: ); // Item M5 有“explicitfor”// 的描述 template<clas ...
- auto_ptr 要点解析
今天看了auto_ptr类的用法,又仔细看了看C++标准库中的符合标准的auto_ptr类别的实作,觉得自己基本上理解了auto_ptr的原理,下面就我的心得写几句,有不正确的地方,希望多多指教. 1 ...
- 以对象管理资源——C++智能指针auto_ptr简介
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...
- 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- 代理设计模式在auto_ptr及smart_ptr中的体现
下面这段代码是auto_ptr的实现: class Image { public: Image(string name): m_imageName(name) {} virtual ~Image() ...
- C++ Primer 与“类”有关的注意事项总结
C++ 与"类"有关的注意事项总结(一) 1. 除了静态 static 数据成员外,数据成员不能在类体中被显式地初始化. 例如 : class First { int memi = ...
- 关于std:auto_ptr std:shared_ptr std:unique_ptr
很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码.本文阐述了如何正确 ...
随机推荐
- tfboys——tensorflow模块学习(二)
tf.contrib模块 tf.contrib 模块是一个比较复杂的模块. contrib细节: tf.contrib.bayesflow.entropy 香农信息论 tf.contrib.baye ...
- 剑指offer 面试6题
面试6题: 题目:从尾到头打印链表 输入一个链表,从尾到头打印链表每个节点的值. 解题代码: # -*- coding:utf-8 -*- # class ListNode: # def __init ...
- PL/SQL不能格式化SQL:--PL/SQL Beautifier could not parse text
PL/SQL sql语句美化器点击没有反应.查看下面提示PL/SQL Beautifier could not parse text.本人此次产生的原因是sql语句语法错误. 工具栏处(如果没有此按钮 ...
- a各种状态
hover 设置对象在其鼠标悬停时的样式表属性 active 设置对象在被用户激活(在鼠标点击与释放之间发生的事件)时的样式表属性.link 设置a对象在未被访问前的样式表属性.visited ...
- Oracle索引(2)索引的修改与维护
修改索引 利用alter index语句可以完成的操作 重建或合并索引 回收索引未使用的空间或为索引非配新空间 修改索引是否可以并行操作及并行度 修改索引的存储参数以及物理属性 指定Logging ...
- MySQL修改管理员账户密码
报错提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)MySQL代理报错提示: ...
- Java 集合系列13之 TreeMap详细介绍(源码解析)和使用示例
转载 http://www.cnblogs.com/skywang12345/p/3310928.html https://www.jianshu.com/p/454208905619
- Qt移植对USB鼠标键盘、触摸屏的支持
.USB键盘 经过一番搜索,发现对Qt键盘的支持主要关系到两个方面: 1. 键盘类型确定: 4.7以前的Qt版本,如果是PS2圆孔键盘,Qt编译时需加上选项:-qt-kbd-vr41xx(未测试):如 ...
- mysql多表查询原理
转:https://www.cnblogs.com/Toolo/p/3634563.html MySQL的多表查询(笛卡尔积原理) 先确定数据要用到哪些表. 将多个表先通过笛卡尔积变成一个表. 然 ...
- 个人对于css sprite的一点点见解
css sprite即CSS雪碧图又称CSS精灵.它存在的一个主要作用就是:减少了网页的http请求次数,从而大大的提高了页面的性能,节省时间和带宽. 例如 这样算下来.CSS sprite真的是个很 ...