标题:又崩溃了!!求解崩溃原因~
只看楼主
okokpypy
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2017-6-1
结帖率:50%
已结贴  问题点数:10 回复次数:4 
又崩溃了!!求解崩溃原因~
#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 没有报错 求解崩溃原因~
搜索更多相关主题的帖子: 崩溃 报错 public virtual 原因 
2020-07-11 18:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
按正确方式写,~A() 改为 virtual ~A()。
2020-07-11 19:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
#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的原因。
}
2020-07-11 19:24
okokpypy
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2017-6-1
得分:0 
感谢版主大大回复 用虚析构函数确实可以解决错误

但我删掉那个virtual也没有报错 也就是取消虚继承 就是取消虚基类 我想虚基类与虚析构函数也应该有某种联系 不然也不会删掉virtual都不报错 就是搞不懂到底是什么联系?
2020-07-11 22:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用okokpypy在2020-7-11 22:25:49的发言:
但我删掉那个virtual也没有报错 也就是取消虚继承 就是取消虚基类 我想虚基类与虚析构函数也应该有某种联系 不然也不会删掉virtual都不报错 就是搞不懂到底是什么联系?

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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502491-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.126646 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved