注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

动态对象创建和auto_ptr  

2012-05-14 20:20:20|  分类: C++编程思想(卷 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

//动态对象创建:
//operator new为变量找到在内存中的安家之所 返回一个void*
//构造函数在new返回的void*上将对象搭建起来
//析构函数在对象的生命周期结束后将对象拆了返回一个void*
//operator delete以构造函数返回的void*为输入 ,将对象原来所占的地方重新归还给系统。
//auto_ptr是个好东西,可以不用防止用户忘记显示调用delete而造成的内存泄露,(自动调用delete)
#include<iostream>
#include<cstdlib>
#include<memory> //auto_ptr
#include<stdexcept> //out_of_range
using namespace std;

class MyClass
{
int *m_p;
int m_n;
public:
MyClass(int *p,int n):m_p(p),m_n(n){ }
~MyClass()
{
delete []m_p;
cout<<"MyClass Destruct"<<endl;
}
int get(int index)throw(out_of_range)
{
try{
if(index<0||index>=m_n)
throw out_of_range("Out_of_range");
}
catch(out_of_range &x)
{cout<<x.what()<<endl;}
return m_p[index];
}
void * operator new(size_t sz)
{
//operator new的返回值是一个void*而不是指向特定类型的指针。new所做的是
//为变量在内存找找到合适的位置并分配合适的内存,而不是完成对一个特定对象的建立并
//返回一个对象的引用——这是构造函数做的事
//new为变量在内存中找到安家的位置,构造函数在位置上把对象建立起来并返回一个指向
//对象的门牌号——指针/引用
cout<<"Operator New"<<endl;
cout<<sz<<endl;
void *p = ::operator new (sz);

return p;
}
void operator delete (void *p)
{
//operator delete()的参数是一个指向由之前operator new
//生成的void*指针,指向void*而不是指向一个特定类型的对象指针是因为在调用delete之前
//先调用了的对象的析构函数返回一个void*,delete就是将变量原来在内存中所占位置清空。
cout<<"Operator Delete"<<endl;
::operator delete (p);
}
};
int main()
{
int *p = new int[10];
for(int i=0;i<10;i++)
p[i] = i;
MyClass *pmyobject1 = new MyClass(p,10);
//delete m;此时如果没有显式调用delete操作删除该指针,将不会释放内存
auto_ptr<MyClass> pmyobject2 (new MyClass(p,10)) ;
//虽然没有显示调用delete但是输出会将pmyobject2释放了!给力!
//活用auto_ptr可以很大程度上解决内存泄露的问题
cout<<pmyobject2->get(6)<<endl;
cout<<sizeof(int)<<endl;
return 0;
}


 运行结果说明了很多东西:

动态对象创建和auto_ptr - 刘邓 - 刘邓

 

 
  评论这张
 
阅读(89)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017