关于autoptr
参考自: http://www.cppblog.com/expter/archive/2009/03/29/78270.html
auto_ptr是什么。
解释1.auto_ptr是一个管理指针的对象,防止内存泄漏和便于程序员编程时的内存管理
解释2.auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。
值得注意的是auto_ptr是一个"对象" 而非指针。
原理(摘自EFFECTIVE C++ 条款13):当把资源放进对象内,当控制流离开函数,对象的析构函数会自动释放那些资源,
所以实际上是 C++的"析构函数自动调用机制"确保资源被释放。
auto_ptr的应用地方
取代局部指针变量
类的指针成员变量
总体来说就是防止函数在运行到delete资源之前突然退出,导致没有把资源delete回收出现的内存泄漏。
用auto_ptr需要引用的头文件:
#include<memory>
局限性:
1.auto_ptr不能指向数组
2.不要将auto_ptr对象作为STL容器的元素
3.不能通过赋值操作来初始化auto_ptr (会使得原来的指针指向变为NULL)
// 自定义一个仿智能指针
template<typename Type>
class Auto_ptr
{
public:
Auto_ptr(Type *p =NULL) :Ptr(p)
{ }
~Auto_ptr()
{
delete Ptr;
}
Type* operator ->()
{
return Ptr;
}
private:
Type *Ptr;
};
可以看出其内部十分简单,大概原理也就如此 但这个类只适用于操纵类成员或者类函数,操纵普通数据如int float也可以,但不能输出其值,因为没有重载<<运算符
使用示例:
Auto_ptr<string> sw(new string("wwss"));
sw->append("ssss");
string q = sw->substr(0,sw->length()-1);
cout<<q<<endl;
再回到stl版本的auto_ptr
一般来说 auto_ptr管理的对象是类的指针成员变量
如class A
A* a = new A();
auto_ptr<A> ss(a); //这样把a放进了ss里面管理,之后就可以用ss代替a进行操作。
之后就不用使用delete a释放内存了。
关于autoptr的更多相关文章
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- POCO库——Foundation组件之核心Core
核心Core: Version.h:版本控制信息,宏POCO_VERSION,值格式采用0xAABBCCDD,分别代表主版本.次版本.补丁版本.预发布版本: Poco.h:简单地包含了头文件Found ...
- 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.
说明 为何要写这篇文章 ,之前看过阿二的梦想船的<Poco::TCPServer框架解析> http://www.cppblog.com/richbirdandy/archive/2010 ...
- EC笔记:第三部分:13、以对象管理资源
C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc ...
- C++STL - 类模板
类的成员变量,成员函数,成员类型,以及基类中如果包含参数化的类型,那么该类就是一个类模板 1.定义 template<typename 类型形参1, typename 类型形参2,...&g ...
- 标准C++之运算符重载和虚表指针
1 -> *运算符重载 //autoptr.cpp #include<iostream> #include<string> using namespace std ...
- C++智能指针管理类
1.程序员明确的进行内存释放 对于c++程序员,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存,需要程序员负责对分配的内存进行释放.但有时内存的释放看起来并不件很轻松的事,如下程序 ...
- C++-Effective C++ Items
Item2:尽量以const,enum,inline替换#define 原因:1, #define ASPECT_RATIO 1.63 编译错误时产生魔数,应以const double Aspect_ ...
- C扩展 C++回顾到入门
引言 C扩展也称C++, 是一个复(za)杂(ji)优(ken)秀(die)的语言. 本文通过开发中常用C++方式来了解和回顾C++这么语言. C++看了较多的书但还是觉得什么都不会. 只能说自己还付 ...
随机推荐
- Tomcat调优
问题定位 对于Tomcat的处理耗时较长的问题主要有当时的并发量.session数.内存及内存的回收等几个方面造成的.出现问题之后就要进行分析了. 1.关于Tomcat的session数目 这个可以直 ...
- C输入输出函数与缓冲区
#转 对C语言输入输出流和缓冲区的深入理解C语言缓冲区(缓存)详解缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的 ...
- 菜菜CPP日记
分支预测建议: http://www.cppblog.com/mysileng/archive/2014/09/29/208454.html #ifndef likely #define likely ...
- [SLAM] GMapping SLAM源码阅读(草稿)
目前可以从很多地方得到RBPF的代码,主要看的是Cyrill Stachniss的代码,据此进行理解. Author:Giorgio Grisetti; Cyrill Stachniss http: ...
- javascript源代码学习之五——jQuery.deferred
jQuery.Defered——异步队列用于管理一组回调函数(成功resolve,失败reject,消息progress),基于上一节实现的jQuery.callbacks完成. done,fail, ...
- MVC控制器获取@Html.DropDownList值
MVC控制器获取@Html.DropDownList值 发表于 2014 年 4 月 1 日 作者 efour — 暂无评论 先贴一段代码,演示@Html.DropDownList的使用. 前台 前台 ...
- android studio 引入第三方类库jar包
第三方类库jar包 这就简单多了,直接将jar包拷贝到app/libs下,然后在app下的build.gradle中添加此jar的依赖.如下: dependencies { compile 'com. ...
- iOS禁用第三方键盘
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)ext ...
- wex5 实战 二维码生成,扫描,蓝牙打印
给人设计了一个小模块,要求是,把一个单号生成二维码,实现扫描查询单号具体信息,并能通过蓝牙把二维码打印出来.功能实现并不复杂,今天一口气把它搞定.来看效果. 一 效果演示: 二.二维码生成 1 在 ...
- HTML5——语音输入
一.使用方式: <input type="text" x-webkit-speech /> 二.属性 1.lang属性:语言种类 <input type=&quo ...