CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

帮忙看看对不对~

楼主qazxsw1982103(波斯猫)2004-04-04 19:41:03 在 C/C++ / C++ 语言 提问

#include   "stdafx.h"  
  #include<iostream.h>  
  class   A  
  {  
  public:  
  virtual   ~A()  
  {  
  cout<<"A::~A()   called.\n";  
  }  
  };  
  class   B:public   A  
  {  
  public:  
  B(int   i)  
  {  
  buf=new   char[i];  
  }  
  virtual   ~B()  
  {  
  delete   []buf;  
  cout<<"B::~B()   called.\n";  
   
                                  //编译器在此处安插调用A::~A()的代码  
  }  
  private:  
  char   *buf;  
  };  
  void   fun(A   *a)  
  {  
  delete   a;                     //a所指向的内存区段中不包括buf,只包括vptr  
  }  
  void   main()  
  {  
  A   *a=new   B(15);  
  fun(a);  
   
  }  
  输出为:  
  B::~B()   called.  
  A::~A()   called.  
   
  请问,此题的最终结果是不是会只析构::A中的一个vptr指针和buf所指向的字符数组。并没有析构字符指针buf,对吗?另外我的注释是否正确?  
  问题点数:0、回复次数:8Top

1 楼maxx(灵魂舞池)回复于 2004-04-04 19:56:54 得分 0

我觉得没错Top

2 楼hcj2002(流浪者·躬自厚而薄责于人 )回复于 2004-04-04 20:23:22 得分 0

buf被释放了  
                    virtual   ~B()  
  {  
  delete   []buf;         //在此释放buf  
  cout<<"B::~B()   called.\n";  
   
                                  //编译器在此处安插调用A::~A()的代码----个人认为,并不是此处  
                                  //安插调用A::~A(),而是在运行时动态调用的的,通过虚函数表的vtpr指针  
    }          
  Top

3 楼freefalcon(心宇—消失中...)回复于 2004-04-04 20:40:42 得分 0

void   fun(A   *a)  
  {  
  delete   a;                     //a所指向的内存区段中不包括buf,只包括vptr  
                //a所指的区域包括vtpr,还包括其成员变量,如果a是B对象的话,a就包括buf  
  }  
   
  请问,此题的最终结果是不是会只析构::A中的一个vptr指针和buf所指向的字符数组。并没有析构字符指针buf,对吗?  
   
  //什么叫析构指针?delete时,其析构函数会被调用,动态分配给指针变量的内存也就被系统回收了,但指针变量本身是在栈上分配的,当变量生命期结束后,它会自动释放的Top

4 楼qazxsw1982103(波斯猫)回复于 2004-04-04 20:59:00 得分 0

什么叫析构指针?delete时,其析构函数会被调用,动态分配给指针变量的内存也就被系统回收了,但指针变量本身是在栈上分配的,当变量生命期结束后,它会自动释放的  
  --------------------------------  
   
  buf在栈上分配吗??  
  buf是类B的数据成员,A   *a=new   B(15);这句话是在堆中分配内存啊  
  Top

5 楼qazxsw1982103(波斯猫)回复于 2004-04-04 21:04:34 得分 0

我所说析构就是释放空间Top

6 楼freefalcon(心宇—消失中...)回复于 2004-04-04 21:20:44 得分 0

如前所说,a所指的内存区域包括了成员变量buf,所以其空间会被释放掉的  
  Top

7 楼qazxsw1982103(波斯猫)回复于 2004-04-04 21:30:47 得分 0

我糊涂了~  
  因为inside   the   c++   object   moden中说指针a的涵盖区域不包括::B的成员。(可能我理解有误吧)  
  现在楼上的兄弟说包括  
   
  俺新手一个,听谁的?  
   
  Top

8 楼freefalcon(心宇—消失中...)回复于 2004-04-04 21:44:32 得分 0

呵呵,我也是新手,大家可以互相讨论嘛  
  我上面所说的这一点,可以通过下面两点得到证实:  
  1.   如果为a分配的内存不包括B的成员的话,那B中的成员是从哪里来的?  
  2.   你在A   *a=new   B(15);前加一个断点,然后F10,你看一下a的地址所指的内存区域,前4个字节是vptr,后面4个字节是buf所指的地址。如果不好看的话,你可以在B中加一个int型的成员变量,并在main中对其进行赋值,然后观察内存的变化  
   
  你说的情况是不是这样的  
  B   b;  
  A&   a=b;  
  此时,a不包括B的成员Top

相关问题

  • 看看对不对!
  • ◇◆◇ 对不起...... (enmity) ◇◆◇
  • 哪里不对???
  • 有分不拿白不拿,对不对?
  • 我不会对对联
  • 这么说对不对?
  • 帮我看看对不对?!
  • 这个排序对不对?
  • 我改的对不对????????
  • 这句话对不对啊?

关键词

  • include

得分解答快速导航

  • 帖主:qazxsw1982103

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo