涉及类指针的C ++面试问题

时间:2010-06-10 07:23:09

标签: c++

假设有一个基类指针指向基类对象:

baseclass *bptr;
bptr= new baseclass;

现在,如果我这样做

bptr= new derived;

这里有什么问题?

11 个答案:

答案 0 :(得分:17)

显而易见的答案是你正在泄漏原始的基类对象。

答案 1 :(得分:7)

除了明显的内存泄漏外,它还取决于baseclassderived的定义,其中一些问题可能是:

  1. derived并非公开源自baseclass(如果是这样,在采访中提出这是一个可怕的问题)
  2. baseclass没有虚拟析构函数(在这种情况下,它对delete bptr;不安全)

答案 2 :(得分:5)

如果我是你,我会回头问你的面试官几个问题:

  1. 您确定这是唯一可用的代码段吗?在这种情况下,我的回答是一个有根据的猜测,仅此而已。
  2. 是否存在基类的某种内存管理方案并派生出来?在这种情况下,我们需要查看运营商未提供的新定义。
  3. 如果没有内存管理,那么基类或派生智能指针类型是否会引用计数?在这些情况下也没有泄漏。
  4. 如果没有智能类型,那么当然这看​​起来像是内存泄漏。
  5. 并且,只有拥有类定义,才能使用虚拟析构函数等。也许采访者正在秘密寻找透视类型。

    Arpan

答案 3 :(得分:2)

  

这里有什么问题?

如果不接受(“内存泄漏”)的答案,问题就是问题或面试官;)

答案 4 :(得分:1)

在第一行中,您声明了一个指针。 在第二行,你在内存中给它一个引用。 在第3行,你在内存中给IT另一个参考。

你给指针的第一个引用被泄露了......你永远无法找回它。

答案 5 :(得分:1)

他是否想要前往Circle Ellipse problem?如果derived是baseclass的特化,那么基类上的一些公共方法可能不再具有例如如果Circle是从Ellipse派生的,而Ellipse有一个名为stretch()的方法,它在一个轴上拉伸椭圆,那么当在Circle实例上调用该方法时你会怎么做?

答案 6 :(得分:0)

您正在重新分配指针而不释放为前一个对象分配的内存。如果在重新分配它之前没有其他人存储了bptr的值,这可能会导致内存泄漏。

答案 7 :(得分:0)

baseclass是否有虚拟析构函数?如果没有,那也可能是坏的(除了明显的泄漏)。

答案 8 :(得分:0)

如果类析构函数未定义为虚拟,则会出现唯一的问题。在这种情况下,它将导致内存泄漏

答案 9 :(得分:0)

没有语法问题但是您通过为“bptr”变量分配新值而丢失了“baseclass”实例的地址。这导致内存泄漏,因为第一个实例化类的地址丢失。

答案 10 :(得分:0)

我会这样回答这个面试问题:

从有限的代码片段中可以清楚地看到,当我们将指针分配给此派生类的实例时会发生内存泄漏,因为我们没有其他指针访问基础对象。但是,如果没有看到两个类的定义,并且看到两个类之间的关系,就不可能再对代码片段说。