c++类中的成员类析构问题

我比较困惑栈实例,和堆实例首先:假如我有两个类A,BclassA{A(){....}~A(){....}}classB{AmyA;A*_A;B(){_A=newA();}... 我比较困惑栈实例,和堆实例
首先:假如我有两个类A,B
class A{
A(){....}
~A(){....}
}
class B{
A myA;
A* _A;
B(){
_A = new A();
}
~B(){
delete _A;
//需要清理myA吗?怎么清理啊?
}
setA(A& a){
this->myA = a;
}
}
main(...){
B *b = new B();
A a;
A *aa = new A();
b->setA(&a);
b->setA(aa);
delete b;
}

当我delete b时,b的myA时自动释放了还是我要手动清理,b里的myA在是在栈上还是b的堆里呢?
当我在调用b->setA(&a)时,b里原来的myA被换成了a,那原来的a时自动释放了吗?
当我在调用b->setA(aa)时,又发生了什么呢?
请高手详细解答啊,我新手困惑好久了
b里的A myA,是在b初始化时自动分配的么?有一位说是在栈里,有一个说是在b的堆里。。。在哪里啊是?
展开
 我来答
阴钰
2010-07-21 · TA获得超过179个赞
知道答主
回答量:45
采纳率:0%
帮助的人:56万
展开全部
1. b的myA在堆里,不用手动清理,因为它不是指针,不是用new分配的就不用delete
2. myA=a 这一步实际上调用了类A的默认 = 操作符,对a没有影响,只是默认把a的每个数据复制到myA
3. 发生错误。
4. 你有个严重错误:形参类型是引用,传a就行,不能传地址。同理,不能用setA(aa)。建议好好复习指针、引用、函数
vbtraz
2010-07-21 · TA获得超过5532个赞
知道大有可为答主
回答量:4152
采纳率:0%
帮助的人:4459万
展开全部
要点在于你要记住: new 必须对应delete, malloc 必须对应free ,其它的不要管。 如果还有疑惑,请再读几遍这句话

把一个东西当函数调用的参数用跟这个东西释放什么的毫无关系

b是个变量又不是函数, 哪来什么栈。 b本身就在堆里, 所以b的成员当然也都在堆里。 但是并不是说堆里的所有东西都要挨个被delete。 在b被delete的时候class B的析构函数运行, 然后B的所有成员变量和父类的析构函数都会被调用, 这都是自动的, 所以你只要delete掉b就行了。 还是那句话(就是第一句我就不重打一遍了) , 当你不知道要不要delete它的时候就想想这句把
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
极天异云
2010-07-21 · TA获得超过1054个赞
知道小有建树答主
回答量:1170
采纳率:42%
帮助的人:398万
展开全部
记着一句话
在c++中
只要不是动态通过指针生成的对象都是可以自动释放的。
在任何高级语言中,
只要不是动态通过指针生成的变量(或者对象)都是可以自动释放的。
具体可以参考一下栈变量和堆变量的区别.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
iamxmz
2010-07-21 · 超过13用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:0
展开全部
这个地方不用手动清理.因为new出来的内存是在堆内存上,函数结束时不会释放,所以要用delete手动清理.A myA这种定义方法申请的内存是在栈内存上,在函数结束时会自动释放,所以不用手动清理.

对于内存清理需要记住:new出来的内存必须要delete.不是new出来的内存系统会自己清理,不需要delete.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式