为了账号安全,请及时绑定邮箱和手机立即绑定

C++多继承和释放内存

C++多继承和释放内存

C++
Carmel_Evans 2019-02-19 15:36:34
#include <iostream>#include <string>using namespace std;class N{public: N() { cout<<"N()"<<endl; } ~N() { cout<<"~N()"<<endl; } void set_name() { name = "Jim"; } string get_name() { return name; }protected: string name; };class B:public N{public: B() { cout<<"B()"<<endl; } ~B() { cout<<"~B()"<<endl; }};class C:public B{public: C() { cout<<"C()"<<endl; } ~C() { cout<<"~C()"<<endl; }};void text(C *n){ n->set_name(); delete n; n = NULL; }int main (){ C c; text(&c);     return 0;}看看这个代码为什么运行时,调用了两次析构函数?而且视频中老师是说并不创建临时变量的呀
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

问题出在 test 函数中的 delete 上。你不应该 delete 的。


delete 一个指针会引起指针所指对象被析构,但前提是这个对象必须是被 new 出来的。 这个 test 中的 c 所指的是 main 函数中的 c,它并不是用 new 构造的,不应该被 delete!

delete 了不正确的指针会引起什么后果呢? 不确定!  C++ 标准并没有规定这时会发生什么。在有的平台下可能看不出什么影响;有的平台下可能会引起重复析构(你遇到的很像这种)......甚至更严重的(更隐晦的)错误。 总之,你知道这样做是错的就好了。


题目中你提到“释放内存”。这里的 c 就是一个简单的局部变量,并不需要额外的操作来“释放”它。当它结束生存期时会被自动释放。   如果这个 c 是被 new 出来的,才应该主动 delete 掉。


另外,也许是你术语运用得不对。你这里就是普通的“单继承”,并不是“多继承”。多继承通常指的是子类同时派生自多个父类。

查看完整回答
1 反对 回复 2019-02-19
  • Carmel_Evans
    Carmel_Evans
    十分感谢您能回答我的问题!术语确实错了,应该是多重继承。我现在知道哪里错了,谢谢!
  • 1 回答
  • 0 关注
  • 990 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信