关于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++看了较多的书但还是觉得什么都不会. 只能说自己还付 ...
随机推荐
- C# 模拟鼠标移动与点击
我们需要用到的mouse_event函数,位于user32.dll这个库文件里面,所以我们要先声明引用. [System.Runtime.InteropServices.DllImport(" ...
- ModSecurity 白名单设置
方法一.SecRuleRemoveById 指令:通过Rule ID禁用指定规则 #waf whitelist <LocationMatch .*> SecRuleRemoveById 9 ...
- 【ionic】微信表情设置教程
NO.0 前提你的下载我的App :超级逗表情 Andorid:http://fir.im/chaojidbq Ios:https://github.com/apanly/chaojidbq (源码, ...
- ubuntu下mysql添加用户的问题
在ubuntu下使用命令: $:sudo apt-get install mysql-server 命令安装的Mysql 版本为:Server version: 5.7.13-0ubuntu0.16. ...
- ReentrantReadWriteLock读写锁详解
一.读写锁简介 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁.在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源:但是如果一个线 ...
- 20. 星际争霸之php设计模式--适配器模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- little alchemy攻略
一个造物游戏: acidrain=rain+smoke airlplain=metal+bird alcohol=fruit+time algae=plant+water allergy=dust+h ...
- 解决Failed to allocate memory: 8转
解决Failed to allocate memory: 8 昨天换了x64的Win7,发现在Eclipse上启动模拟器的时候存在问题,当设置的模拟器分辨率大于400×800的时候会出现 Failed ...
- Java:String和Date、Timestamp之间的转
Java:String和Date.Timestamp之间的转 一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr ...
- MVC异常日志生产者消费者模式记录(异常过滤器)
生产者消费者模式 定义自己的异常过滤器并注册 namespace Eco.Web.App.Models { public class MyExceptionAttribute : HandleErro ...