C++:无虚函数的类作为有虚函数类的父类时产生Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > C++:无虚函数的类作为有虚函数类的父类时产生Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

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

 2014/9/24 15:53:23  cherishLC  程序员俱乐部  我要评论(0)
  • 摘要:调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)这个错误信息是在MSVC下的debug模式下跑出的,如果用release版本,则程序直接崩溃!!很严重的错误有木有!老规矩,先奉上结论:父类没有虚函数(且没有虚析构函数),子类含有虚函数(只含有虚析构函数也算)时,如果指针类型为父类的(但指向子类的实例),就会出现Expression:_BLOCK_TYPE_IS_VALID
  • 标签:expression 函数 c++
调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了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;;
}
上一篇: 遍历控件 下一篇: 前台获取标签内容
发表评论
用户名: 匿名