游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5447|回复: 13

找错,一道华为的面试题

[复制链接]

11

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2006-11-15 21:45:00 | 显示全部楼层 |阅读模式
class Base
{
  public:
  Base() {}
  ~Base() {}
};

class A : public Base
{
public:
  A() {m_pData = NULL;}
  A(int nSize) { m_pData = new int[nSize]; }
~A() { delete []m_pData; }
   

private:
  int * m_pData;
};

void main()
{
   Base * b = new A(100);
   delete b;
}

找出错误,说明原因,应该如何“合理”地改正?
大师们发表下意见

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2006-11-15 22:13:00 | 显示全部楼层

Re:找错,一道华为的面试题

目前的程序没看到错误,但是如果
void main()
{
   Base * b = new A();
   delete b;
}
就会发生内存释放错误。

17

主题

73

帖子

77

积分

注册会员

Rank: 2

积分
77
发表于 2006-11-15 22:28:00 | 显示全部楼层

Re:找错,一道华为的面试题

由于编译期间b的析构函数地址已经被确定导致A的析构函数没有被调用(真绕口--b),从而发生内存泄漏,改正方法:~Base()前加上个virtual修饰

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2006-11-16 09:05:00 | 显示全部楼层

Re:找错,一道华为的面试题

class Base
{
  public:
  Base() {}
  virtual ~Base() {}  // should be virual base
};

class A : public Base
{
// should put data members ahead of methods if they are used in the
// rest of class declaration

private:
  int * m_pData;  

public:
  // one constructor is pretty enough, and "explicit" keyword sould be
  // used

  explicit A(int nSize = 0) : m_pData(NULL) {
     // exception is not mandatory, but it's better to have it in constructors
     try {
        if( nSize ) m_pData = new int[nSize];
     } catch (...) {...};
  }
~A() { delete []m_pData; }
   
  // because there is a pointer in the class, either you provide copy
  // constructor and operator = , or make them private

private:
   A(const A &);
   A & operator = (const A &);
};


Conclusion
If the correct answer to this quesion is only the "virtual", either you or
the person who wrote this question should Tan JJ Dao Si

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-16 10:53:00 | 显示全部楼层

Re:找错,一道华为的面试题

bravo!
aear's answer is very clear.

4

主题

66

帖子

66

积分

注册会员

Rank: 2

积分
66
发表于 2006-11-16 11:02:00 | 显示全部楼层

Re:找错,一道华为的面试题

额...马肝大大已经结案了啊....来晚了....

33

主题

544

帖子

554

积分

高级会员

Rank: 4

积分
554
发表于 2006-11-16 12:13:00 | 显示全部楼层

Re:找错,一道华为的面试题

基类的析构函数要是virtual,哈哈

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2006-11-16 19:38:00 | 显示全部楼层

Re:找错,一道华为的面试题

~A() { delete []m_pData; }

delete前必须做 if(m_pData) 的判断

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2006-11-16 20:30:00 | 显示全部楼层

Re:找错,一道华为的面试题

Tan JJ Dao Si

----------------????

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-17 09:58:00 | 显示全部楼层

Re:找错,一道华为的面试题

delete空指针将会直接返回,所以是安全的,毋须判断
除非是同一个指针会多次使用时才需要注意该情况
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表