C++:无虚函数的类作为有虚函数类的父类时产生Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)...

[size=large]调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了[color=red]Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)[/color]
这个错误信息是在MSVC下的debug模式下跑出的,如果用release版本,则程序直接崩溃!!很严重的错误有木有![/size]

[size=large]老规矩,先奉上[/size][size=x-large][color=blue]结论:[/color][/size][size=large]父类没有虚函数(且没有虚析构函数),子类含有虚函数(只含有虚析构函数也算)时,如果指针类型为父类的(但指向子类的实例),就会出现[color=red]Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)[/color]。
我猜测这是由于父类没有虚函数,也就没有为虚函数表分配空间。但是子类有虚函数,也就为虚函数表分配了空间!至于为神马这样就会出错,就不得而知了!

当然,好的编程习惯还是要将父类的析构函数设为虚函数的,这样一来子类的析构函数总是会被调用,这样比较不容易出现内存泄露。[/size]

[size=large]程序如下:[/size]

#include <iostream>
class A {
public:
A() {
std::cout << __FUNCTION__ << std::endl;
}
~A() { //解决方案1:将这个函数改为virtual的,推荐~这样释放下面的pB指针时也会调用B的析构函数
std::cout << __FUNCTION__ << std::endl;
}
//virtual void fA(){} //解决方案2:给父类A添加个虚函数
};

class B : public A {
public:

B() {
std::cout << __FUNCTION__ << std::endl;
}

virtual ~B() {//添堵的虚函数1:父类A完全没有虚函数,子类的析构函数设为虚函数照样报错
std::cout << __FUNCTION__ << std::endl;
}

virtual void func() {} //添堵的虚函数2:父类A完全没有虚函数,子类的有虚函数就会报错
};


void main() {
A* pB = new B();
delete pB;
pB = nullptr;;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值