• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

C/C++/C#面试题精选

发布: 2011-3-09 10:39 | 作者: 何海涛 | 来源: 本站原创 | 查看: 129次 | 进入软件测试论坛讨论

领测软件测试网

  题目(15):运行下图中代码,输出的结果是什么?这段代码有什么问题?

  #include

  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 _tmain(int argc, _TCHAR* 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中创建了一些资源,比如文件句柄、内存等,在这种情况下都得不到释放,从而导致资源泄漏。

  博主何海涛对本博客文章享有版权。网络转载请注明出处http://blog.csdn.net/cadcisdhht

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

33/3<123

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网