帮忙看看对不对~
#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




