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的堆里。。。在哪里啊是? 展开
首先:假如我有两个类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的堆里。。。在哪里啊是? 展开
展开全部
要点在于你要记住: new 必须对应delete, malloc 必须对应free ,其它的不要管。 如果还有疑惑,请再读几遍这句话
把一个东西当函数调用的参数用跟这个东西释放什么的毫无关系
b是个变量又不是函数, 哪来什么栈。 b本身就在堆里, 所以b的成员当然也都在堆里。 但是并不是说堆里的所有东西都要挨个被delete。 在b被delete的时候class B的析构函数运行, 然后B的所有成员变量和父类的析构函数都会被调用, 这都是自动的, 所以你只要delete掉b就行了。 还是那句话(就是第一句我就不重打一遍了) , 当你不知道要不要delete它的时候就想想这句把
把一个东西当函数调用的参数用跟这个东西释放什么的毫无关系
b是个变量又不是函数, 哪来什么栈。 b本身就在堆里, 所以b的成员当然也都在堆里。 但是并不是说堆里的所有东西都要挨个被delete。 在b被delete的时候class B的析构函数运行, 然后B的所有成员变量和父类的析构函数都会被调用, 这都是自动的, 所以你只要delete掉b就行了。 还是那句话(就是第一句我就不重打一遍了) , 当你不知道要不要delete它的时候就想想这句把
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
记着一句话
在c++中
只要不是动态通过指针生成的对象都是可以自动释放的。
在任何高级语言中,
只要不是动态通过指针生成的变量(或者对象)都是可以自动释放的。
具体可以参考一下栈变量和堆变量的区别.
在c++中
只要不是动态通过指针生成的对象都是可以自动释放的。
在任何高级语言中,
只要不是动态通过指针生成的变量(或者对象)都是可以自动释放的。
具体可以参考一下栈变量和堆变量的区别.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个地方不用手动清理.因为new出来的内存是在堆内存上,函数结束时不会释放,所以要用delete手动清理.A myA这种定义方法申请的内存是在栈内存上,在函数结束时会自动释放,所以不用手动清理.
对于内存清理需要记住:new出来的内存必须要delete.不是new出来的内存系统会自己清理,不需要delete.
对于内存清理需要记住:new出来的内存必须要delete.不是new出来的内存系统会自己清理,不需要delete.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询