C++中动态内存分配引发问题的解决方案_第1页
C++中动态内存分配引发问题的解决方案_第2页
C++中动态内存分配引发问题的解决方案_第3页
C++中动态内存分配引发问题的解决方案_第4页
C++中动态内存分配引发问题的解决方案_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

经典word整理文档,仅参考,双击此处可删除页眉页脚。本资料属于网络整理,如有侵权,请联系删除,谢谢!2004-10-2110:44:邹浩浩出处:天极网责任编辑:方舟Wrong.h:#ifndefWRONG_H_#defineWRONG_H_classWrong{private:public:Wrong();//默认构造函数};#endiflen=strlen(s);Wrong::Wrong(){}Wrong::~Wrong(){cout<<这个字符串将被删除:<<str<<'\n';//为了方便观察结果,特留此行代码。delete[]str;}ostream&operator<<(ostream&os,constWrong&st){test_right.cpp:{}大家可以看到,以上程序十分正确,而且也是十分有用的。可是,我们不能被表面现象所test_wrong.cpp文件替换test_right.cpp器可能就是根本不能进行编译!voidshow_right(constWrong&);voidshow_wrong(constWrong);//注意,参数非引用,而是按值传递。intmain(){cout<<test1<<endl;//在Dev-cpp上没有任何反应。cout<<使用正确的函数:<<endl;wrong3=test4;}voidshow_right(constWrong&a){}{}下面分别输入三个范例:?=wrong2:第三个范例。wrong3:第四个范例。首先,大家要知道,++类有以下这些极为重要的函数:一:复制构造函数。在我们提供这样的代码:Wrongtest1(test2)也就是没有用引用和指针作为类型时,如:voidshow_wrong(constWrong),它会被调用。其实,还有一些情况,但在这儿就不列举了。{在平时,这样并不会有任何的问题出现,但我们用了new操作符,涉及到了动态内存分配,我们就不得不谈谈浅复制和深复制了。以上的函数就是实行的浅复制,它只是复制了指针,而并没有复制指针指向的数据,可谓一点儿用也没有。打个比方吧!就像一个朋友让你把一个程序通过网络发给他,而你大大咧咧地把快捷方式发给了他,有什么用处呢?我们来具体谈谈:假如,A对象中存储了这样的字符串:“C++。它的地址为2000。现在,我们把对象赋给对象:WrongB=A。现在,和对象的str指针均指向2000地址。看似可以使用,但如果B对象的析构函数被调用时,则地址2000处的字符串++已经被从内存中抹去,而对象仍然指向地址2000。这时,如果我们写下这样的代码:cout<<<<或是等待程序结束,对象的析构函数被调用时,对象的数据能否显示出来呢?只会是乱码。而且,程序还会这样做:连续对地址2000处使用两次delete操作符,这样的后果是十分严重的!本例中,有这样的代码:假设test1中str指向的地址为2000,而wrong中str指针同样指向地址2000,我们删除了2000处的数据,而test1对象呢?已经被破坏了。大家从运行结果上可以看到,我们使用cout<<test1时,一点反应也没有。而在test1的析构函数被调用时,显示是这样:这个字符串将被删除:。{我们执行的是深复制。这个函数的功能是这样的:假设对象A中的str指针指向地址2000,内容为“IamaC++Boy!”我们执行代码Wrong时,我们先开辟出一块内存,假设为3000。我们用strcpy函数将地址2000的内容拷贝到地址3000中,再将对象的str指针指向地址3000。这样,就互不干扰了。大家把这个函数加入程序中,问题就解决了大半,但还没有完全解决,问题在赋值函数上。我们的程序中有这样的段代码:Wrongwron

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论