猿问

C++多继承和释放内存

#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;

}

看看这个代码

为什么运行时,调用了两次析构函数?而且视频中老师是说并不创建临时变量的呀

Carmel_Evans
浏览 1030回答 1
1回答

onemoo

问题出在 test 函数中的 delete 上。你不应该 delete 的。delete 一个指针会引起指针所指对象被析构,但前提是这个对象必须是被 new 出来的。 这个 test 中的 c 所指的是 main 函数中的 c,它并不是用 new 构造的,不应该被 delete!delete 了不正确的指针会引起什么后果呢? 不确定!  C++ 标准并没有规定这时会发生什么。在有的平台下可能看不出什么影响;有的平台下可能会引起重复析构(你遇到的很像这种)......甚至更严重的(更隐晦的)错误。 总之,你知道这样做是错的就好了。题目中你提到“释放内存”。这里的 c 就是一个简单的局部变量,并不需要额外的操作来“释放”它。当它结束生存期时会被自动释放。   如果这个 c 是被 new 出来的,才应该主动 delete 掉。另外,也许是你术语运用得不对。你这里就是普通的“单继承”,并不是“多继承”。多继承通常指的是子类同时派生自多个父类。
随时随地看视频慕课网APP
我要回答