注册 登录
编程论坛 C++教室

又崩溃了!!求解崩溃原因~

okokpypy 发布于 2020-07-11 18:32, 1649 次点击
#include <iostream>
using namespace std;
class A {
public:
~A() { cout << "析构A\n"; }
};

class B : virtual public A {                  //删掉virtual 没有报错
public:
~B() { cout << "析构B\n"; }
};
int main() {
A *p = new B;
delete p;
return 0;
}
这段代码在vc 6.0中崩溃 但删掉virtual 没有报错 求解崩溃原因~
4 回复
#2
rjsp2020-07-11 19:13
按正确方式写,~A() 改为 virtual ~A()。
#3
rjsp2020-07-11 19:24
#include <iostream>

struct A
{
    int temp; // 占位,使类型大小不为0。下同
    /*virtual*/ ~A()
    {
        std::clog << "析构A\n";
    }
};

struct B
{
    int temp;
    /*virtual*/ ~B()
    {
        std::clog << "析构B\n";
    }
};

struct C : A, B
{
    int temp;
    /*virtual*/ ~C()
    {
        std::clog << "析构C\n";
    }
};

int main( void )
{
    B* p1 = new B;
    delete p1;
   
    C* p = new C;
    B* p2 = p;
    std::cout << "p = " << p << '\n';
    std::cout << "p2 = " << p2 << std::endl;
    delete p2; // p2是不等于p的,传 p2 给 delete,delete 怎么知道应该释放 p 值处的内存?这就是为什么析构函数要加virtual的原因。
}
#4
okokpypy2020-07-11 22:25
感谢版主大大回复 用虚析构函数确实可以解决错误

但我删掉那个virtual也没有报错 也就是取消虚继承 就是取消虚基类 我想虚基类与虚析构函数也应该有某种联系 不然也不会删掉virtual都不报错 就是搞不懂到底是什么联系?
#5
rjsp2020-07-12 08:09
以下是引用okokpypy在2020-7-11 22:25:49的发言:
但我删掉那个virtual也没有报错 也就是取消虚继承 就是取消虚基类 我想虚基类与虚析构函数也应该有某种联系 不然也不会删掉virtual都不报错 就是搞不懂到底是什么联系?

不要研究“错误的代码”为什么会“报错”或不报错,那没有任何意义。
就你的代码来说,你换个编译器试试,也许就“不报错”了,但这不表明你的代码是正确的。
1