非是非
Thinking, Express
|

测验题目

问题:
    运行下图中代码,输出的结果是什么?这段代码有什么问题?
    
    #include <iostream>
    
    class A {
    public:
      A() {
        std::cout << "A is created." << std::endl;
      }
    
      ~A(){
        std::cout << "A is deleted." << std::endl;
      }
    };
    
     
    
    class B : public A{
    public:
      B() {
        std::cout << "B is created." << std::endl;        
      }
    
      ~B() {
        std::cout << "B is deleted." << std::endl;
      }
    };
    
     
    
    int main(int argc, char* argv[]){
      A* pA = new B();
      delete pA;
    
      return 0;
    }
    
    参考答案:
    输出三行,分别是:A is created. B is created. A is
    deleted。用new创建B时,回调用B的构造函数。在调用B的构造函数的时候,会先调用A的构造函数。因此先输出A is created. B is created.
    
    接下来运行delete语句时,会调用析构函数。由于pA被声明成类型A的指针,同时基类A的析构函数没有标上virtual,因此只有A的析构函数被调用到,而不会调用B的析构函数。
    
    由于pA实际上是指向一个B的实例的指针,但在析构的时候只调用了基类A的析构函数,却没有调用B的析构函数。这就是一个问题。如果在类型B中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。
    非是非 | 联系 | 关于 | 向开发者捐赠 |

    版权所有 © 非是非, 2007~2015

    我觉得这个站点或页面: 有用 没用 有趣 无趣 有错 |