永发信息网

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

答案:4  悬赏:60  手机版
解决时间 2021-01-25 14:47
  • 提问者网友:容嬷嬷拿针来
  • 2021-01-25 02:14
我比较困惑栈实例,和堆实例 首先:假如我有两个类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的堆里。。。在哪里啊是?
最佳答案
  • 五星知识达人网友:毛毛
  • 2021-01-25 03:39
1. b的myA在堆里,不用手动清理,因为它不是指针,不是用new分配的就不用delete
2. myA=a 这一步实际上调用了类A的默认 = 操作符,对a没有影响,只是默认把a的每个数据复制到myA
3. 发生错误。
4. 你有个严重错误:形参类型是引用,传a就行,不能传地址。同理,不能用setA(aa)。建议好好复习指针、引用、函数
全部回答
  • 1楼网友:迟山
  • 2021-01-25 07:29
要点在于你要记住: new 必须对应delete, malloc 必须对应free ,其它的不要管。 如果还有疑惑,请再读几遍这句话 把一个东西当函数调用的参数用跟这个东西释放什么的毫无关系 b是个变量又不是函数, 哪来什么栈。 b本身就在堆里, 所以b的成员当然也都在堆里。 但是并不是说堆里的所有东西都要挨个被delete。 在b被delete的时候class B的析构函数运行, 然后B的所有成员变量和父类的析构函数都会被调用, 这都是自动的, 所以你只要delete掉b就行了。 还是那句话(就是第一句我就不重打一遍了) , 当你不知道要不要delete它的时候就想想这句把
  • 2楼网友:由着我着迷
  • 2021-01-25 06:14
这个地方不用手动清理.因为new出来的内存是在堆内存上,函数结束时不会释放,所以要用delete手动清理.A myA这种定义方法申请的内存是在栈内存上,在函数结束时会自动释放,所以不用手动清理. 对于内存清理需要记住:new出来的内存必须要delete.不是new出来的内存系统会自己清理,不需要delete.
  • 3楼网友:摆渡翁
  • 2021-01-25 04:39
因为基类的析构函数不是虚析构函数,所以是根据指针的类型调用析构函数,而不是根据指针指向对象的类型调用析构函数。 虚函数是在基类中被声明为 virtual,并在派生类中重新定义的成员函数,可实现成员函数的动态重载。 当一个类作为基类时,它的析构函数应该为虚析构函数。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯