【VS开发】【C++开发】正确使用auto_ptr智能指针
1, auto_ptr类
auto_ptr是一个模板类,定义如下:
template <typename Type>
class auto_ptr {...};
它存储的是一个指向Type的指针。
顾名思义,auto_ptr是一种智能指针,它包含一个动态分配内存的指针,并在它生命周期结束的时候,销毁包含的指针所指向的内存。
例1:
void f()
{
Type* pt(new Type);
//一些代码...
delete pt;
}
这样的代码很常见,但它有可能造成内存泄露。首先你用了new,你就要记得用delete,但即使你记住了用delete,还是会出问题。如果f()在执行delete pt之前,就抛出了异常,函数返回了。那么这个分配的对象就没被删除。
使用auto_ptr,很优雅的解决了这些问题。
例2:
void f()
{
auto_ptr<Type> pt(new Type);
//一些代码...
}
现在的代码,不会泄露Type类型的对象。不管是函数正常结束,还是抛出异常结束,都会调用pt的析构函数,从而删除分配的对象。
2, auto_ptr构造函数
构造函数1:explicit auto_ptr(Type* _Ptr =
0) throw( );
auto_ptr<int> pt; //包含一个int*的指针,并初始化为NULL
auto_ptr<int> pt(new int(123)); //包含一个int*的指针,并初始化为123的地址
auto_ptr<int> pt = new int(123); //error!构造函数声明为explicit
构造函数2:auto_ptr(auto_ptr<Type>& _Right) throw(
);
int* ptr = new int();
auto_ptr<int> pt1(ptr); //构造函数1
auto_ptr<int> pt2(pt1); //将pt1的使用权转给pt2,注意pt1指向NULL了
//pt1调用了本身的release()函数,将内部指针地址传给pt2
构造函数3:template<typename Other>
auto_ptr(auto_ptr<Other>& _Right) throw(
);
声明这样一个拷贝构造函数的目的,就是为了派生类指针能转换成基类的指针。
例:
class Base { };
class Derived : public Base { };
auto_ptr<Derived> pDerived(new Derived);
auto_ptr<Base> pBase(pDerived); //让这样的代码能通过编译器
其本质是为了让,auto_ptr类内部的Derived*转换为Base*
构造函数4:auto_ptr(auto_ptr_ref<Type> _Right) throw(
);
//暂略
3, auto_ptr成员函数
成员函数1:Type* get( ) const throw( );
获得包含指针的地址
int* ptr = new int(123);
auto_ptr<int> pt(ptr);
assert(pt.get() == ptr); //相等,指向同一地址
成员函数2:Type* release( ) throw( );
返回包含指针的地址,并将包含指针设为NUll
string* pstr = new string("hello");
auto_ptr<string> pt(pstr);
pt.release(); //不在指向string对象
//此时,pt.get()等于NULL
delete pstr; //应该手动删除pstr指向的内存块
成员函数3:void reset(Type* _Ptr
= 0);
double* pdouble1 = new double(3.14);
double* pdouble2 = new double(1.23);
auto_ptr<double> pt1(pdouble1);
pt1.reset(pdouble2); //将删除pt1所指向的内存块就是pdouble1指向的那块
//此时,pt.get()等于pdouble2
cout << *pdouble1; //error,pdouble已经是野指针了。
4, 使用总结
1,auto_ptr存储的指针应该为NULL或者指向动态分配的内存块。
2,auto_ptr存储的指针应该指向单一物件(是new出来的,而不是new[]出来的)。
3,两个auto_ptr对象不会同时指向同一块内存块。要明白2个auto_ptr对象赋值会发生什么。
4,千万不要把auto_ptr对象放在容器中。
5,当将auto_ptr作为函数参数时,最好声明为const auto_ptr<T>&(by const ref).当函数返回值可以简单的传值(by value).
【VS开发】【C++开发】正确使用auto_ptr智能指针的更多相关文章
- C++ auto_ptr智能指针的用法
C++中指针申请和释放内存通常采用的方式是new和delete.然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内存.下面简单说一下用法. 用法一: std: ...
- c++ auto_ptr智能指针
c++ auto_ptr智能指针 该类型在头文件memory中,在程序的开通通过 #include<memory> 导入,接下来讲解该智能指针的作用和使用. 使用方法: auto_ptr& ...
- shared_ptr 和auto_ptr智能指针
shared_ptr:计数的智能指针 它是一个包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时 ...
- c++ auto_ptr 智能指针
c++使用智能指针应该保证无论在何种情况下,只要自己被摧毁,就一定连带释放其所有资源,而由于智能型指针本身就是区域变量, 所以无论是正常退出,还是异常退出,只要函数退出,它就一定销毁 常数型auto_ ...
- boost准模板库scoped_ptr指针的使用以及auto_ptr智能指针的对照
首先我们看看scoped_ptr的基本使用,包括了swap(),get(),reset()的使用,重要的提醒是作用域结束的时候会自己主动析构,无需手动的释放资源: #include<boost/ ...
- auto_ptr智能指针
C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理. 使用std::auto_ptr,要#include <memory>.
- 智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
1. 引入 C++语言中的动态内存分配没有自动回收机制,动态开辟的空间需要用户自己来维护,在出函数作用域或者程序正常退出前必须释放掉. 即程序员每次 new 出来的内存都要手动 delete,否则会造 ...
- 智能指针auto_ptr & shared_ptr
转载:智能指针auto_ptr 很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生 ...
随机推荐
- SIGAI机器学习第十七集 线性模型1
讲授logistic回归的基本思想,预测算法,训练算法,softmax回归,线性支持向量机,实际应用 大纲: 再论线性模型logistic回归的基本思想预测函数训练目标函数梯度下降法求解另一种版本的对 ...
- Oracle的dual是什么东西啊??(答:伪表)
1. dual 确实是一张表.是一张只有一个字段,一行记录的表.2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.如:se ...
- 二维bit模板
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define N 1100 const int mo ...
- mysql中 where与having的区别
having子句与where有相似之处但也有区别,都是设定条件的语句.在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优 ...
- ROS中make_plan服务的使用
路径规划:从一个点到另一个点,规划出最优的路线.用到service :make_plan (nav_msgs/GetPlan) 服务名为move_base_node/make_plan nav_msg ...
- 三十三、DNS资源记录类型和请求流程
DNS分布均衡(Load balance)的实现 在上级数据库中写两条记录(同一个名字对应对个IP时),DNS会自动将请求基于轮循方式,分给每个DNS服务器 例如: 第一次将请求给第一个DNS,第二次 ...
- Linux下MySQL的操作(最全)
注意:这里以mariadb为例 启动mysql服务 systemctl start mariadb 登录mysql mysql -u root -p SQL语言分类 - 数据定义语言:简称[DDL]( ...
- java.lang.IllegalStateException: Method get not annotated with HTTP method type (ex. GET, POST);
明明指定了请求方法类型还报错: 代码: @RequestMapping(value="/enterprise/detail",method = RequestMethod.POST ...
- 我的BO之导航属性
我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 数据需要导航 数据之间普遍存在关系,做业务处理时往往也是按照关系在数据之间查询和处理.业务处理可 ...
- 系统调优:如何解决系统报错too many open files
一.检查系统版本是否手工升级 关于lsb_release -a和/etc/issue显示的发行版本号不同,原因只有一个:系统内核手动升级了 对于高并发高http连接的应用程序例如www或Java,会遇 ...