调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
这个错误信息是在MSVC下的debug模式下跑出的,如果用release版本,则程序直接崩溃!!很严重的错误有木有!
老规矩,先奉上结论:父类没有虚函数(且没有虚析构函数),子类含有虚函数(只含有虚析构函数也算)时,如果指针类型为父类的(但指向子类的实例),就会出现Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)。
我猜测这是由于父类没有虚函数,也就没有为虚函数表分配空间。但是子类有虚函数,也就为虚函数表分配了空间!至于为神马这样就会出错,就不得而知了!
当然,好的编程习惯还是要将父类的析构函数设为虚函数的,这样一来子类的析构函数总是会被调用,这样比较不容易出现内存泄露。
程序如下:
class="C++" name="code">
#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;;
}