关于动态空间的类指针跟构造析构的关系
关于动态空间的类指针和构造析构的关系?
class AA
{
public:
AA()
{
cout<<"AA constructor"<<endl;
m_aa=new char[10];
}
~AA()
{
delete []m_aa;
cout<<"~AA"<<endl;
}
private:
char* m_aa;
};
class BB:public AA
{
public:
BB()
{
cout<<"BB constructor"<<endl;
m_bb=new char[10];
}
~BB()
{
delete []m_bb;
cout<<"~BB"<<endl;
}
private:
char* m_bb;
};
int main()
{
AA *paa;
BB *pbb=new BB;
paa=pbb;
delete paa;
return 0;
}
输出结果是:
AA constructor
BB constructor
~AA
求问上面代码的具体调用过程是怎么样的?
------解决方案--------------------
//
1)BB *pbb=new BB;===>
//1.1)
pbb = operator new (sizoof(BB));
//1.2)
new (pbb) BB();====> pbb->BB();===>
lea ecx,pbb //this 指针
call BB ===>
{
//1) 自动生成的代码,调用构造函数
//先调用父类的构造函数,然后是,依序调用,非静态成员变量的构造函数.
//初始化表里的顺序,和实际构造顺序无关
//构造顺序,只和继承---父类---以及定义---成员变量---顺序有关.
1.2.1) AA() ===>
add ecx ,offset_AAofBB //AA 类子对象 的this 指针 = BB的 this + AA 在BB 内的偏移量
call AA===>
{
1.2.1.1) cout<<"AA constructor"<<endl;====>
//输出 AA constructor
m_aa=new char[10];
}
1.2.2)构造函数的内部代码{
m_bb=new char[10];
1.2.2.1) cout<<"BB constructor"<<endl;===>
//输出 BB constructor
}
}
//2)paa=pbb; //paa =pbb + offset_AAofBB
//3)delete paa;===>
//3.1)
paa->~AA();===>
//输出 ~AA
//3.2)
operator delete(paa);
PS :
~BB 从来就没有执行过.
所以需要虚析构函数,才能在多态时,正确销毁,父类指针指向的,子类对象.
class AA
{
public:
AA()
{
cout<<"AA constructor"<<endl;
m_aa=new char[10];
}
~AA()
{
delete []m_aa;
cout<<"~AA"<<endl;
}
private:
char* m_aa;
};
class BB:public AA
{
public:
BB()
{
cout<<"BB constructor"<<endl;
m_bb=new char[10];
}
~BB()
{
delete []m_bb;
cout<<"~BB"<<endl;
}
private:
char* m_bb;
};
int main()
{
AA *paa;
BB *pbb=new BB;
paa=pbb;
delete paa;
return 0;
}
输出结果是:
AA constructor
BB constructor
~AA
求问上面代码的具体调用过程是怎么样的?
------解决方案--------------------
//
1)BB *pbb=new BB;===>
//1.1)
pbb = operator new (sizoof(BB));
//1.2)
new (pbb) BB();====> pbb->BB();===>
lea ecx,pbb //this 指针
call BB ===>
{
//1) 自动生成的代码,调用构造函数
//先调用父类的构造函数,然后是,依序调用,非静态成员变量的构造函数.
//初始化表里的顺序,和实际构造顺序无关
//构造顺序,只和继承---父类---以及定义---成员变量---顺序有关.
1.2.1) AA() ===>
add ecx ,offset_AAofBB //AA 类子对象 的this 指针 = BB的 this + AA 在BB 内的偏移量
call AA===>
{
1.2.1.1) cout<<"AA constructor"<<endl;====>
//输出 AA constructor
m_aa=new char[10];
}
1.2.2)构造函数的内部代码{
m_bb=new char[10];
1.2.2.1) cout<<"BB constructor"<<endl;===>
//输出 BB constructor
}
}
//2)paa=pbb; //paa =pbb + offset_AAofBB
//3)delete paa;===>
//3.1)
paa->~AA();===>
//输出 ~AA
//3.2)
operator delete(paa);
PS :
~BB 从来就没有执行过.
所以需要虚析构函数,才能在多态时,正确销毁,父类指针指向的,子类对象.