C++ C++;涉及课堂指导员的面试问题

C++ C++;涉及课堂指导员的面试问题,c++,C++,假设有一个基类指针指向基类对象: baseclass *bptr; bptr= new baseclass; 现在如果我这样做了 bptr= new derived; 这里的问题是什么?显而易见的答案是,您正在泄漏原始基类对象。您正在重新分配指针,而没有释放为上一个对象分配的内存。如果在重新分配bptr值之前没有其他主体存储该值,这可能会导致内存泄漏。在第一行中,您声明了一个指针。 在第二行中,您在内存中给它一个引用。 在第3行中,您在内存中给它另一个引用 你给指针的第一个引用被泄露了…你永

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

baseclass *bptr;
bptr= new baseclass;
现在如果我这样做了

bptr= new derived;

这里的问题是什么?

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

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

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


你给指针的第一个引用被泄露了…你永远也找不到它。

基类是否有虚拟析构函数?如果不是,那也可能很糟糕(除了明显的泄漏)。

除了明显的内存泄漏,它取决于
基类和
派生的
的定义。一些问题可能是:

  • 派生的
    不是公开派生自
    基类的
    (如果是这样的话,在采访中问这个问题很可怕)
  • 基类
    没有虚拟析构函数(在这种情况下,
    删除bptr;
    是不安全的)

  • 他是不是想去医院?如果派生是基类的特殊化,则基类上的一些公共方法可能不再具有意义,例如,如果圆是从椭圆派生的,而椭圆有一个称为stretch()的方法,该方法将椭圆拉伸到一个轴上,当在Circle实例上调用该方法时,您会怎么做?

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

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

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

  • 您确定这是唯一可用的代码片段吗?在这种情况下,我的答案是一个有根据的猜测,仅此而已
  • 基类和派生类是否有某种内存管理方案?在这种情况下,我们需要研究未提供的运算符新定义
  • 如果没有内存管理,那么基类或派生的智能指针类型是否进行引用计数?在这些情况下也没有泄漏
  • 如果没有智能类型,那么当然这看起来像是内存泄漏
  • 请,只有在您有类定义的情况下,才有虚拟析构函数等。也许面试官在暗中寻找有洞察力的人

    阿潘

    这里有什么问题


    如果“内存泄漏”的答案不被接受,问题要么是问题,要么是面试官;)

    我会这样回答这个采访问题:


    从提供的有限代码片段可以清楚地看出,当我们将指针分配给这个派生类的实例时,内存泄漏将接踵而至,因为我们没有其他指针访问基对象。但是,如果没有看到这两个类的定义,就不可能再谈论代码片段了,看看这两个类之间的关系。

    这是我的答案……事实上……但他向我暗示了我能解决的任何其他问题。有一件事可能是派生的必须是从基类派生的。@benjamin button:如果基类析构函数不是虚拟的,那么当你
    删除bptr未调用派生类析构函数。但我不知道这是否与此相关。@Naveen:那完全错了。如果基类没有一个未定义行为的虚拟析构函数,没有调用某个析构函数。我们可以补充一点,如果
    基类
    派生的
    没有无参数构造函数,代码将不会编译。这的确很愚蠢,但没有比在看不到类时让您猜测这些类的编写是否正确更愚蠢的了。此外,如果答案与缺少虚拟析构函数有关,那么第二行就没有必要了。你有这个或者类的声明吗?我将使用不一致的命名方案。如果您有
    基类
    ,那么逻辑上您也会有
    派生类
    。而且,间距有各种各样的错误。每个人都知道星号属于类型,而不是变量。@Dennis星号在逻辑上属于类型,但在语法上属于变量。试试这个,告诉我ptr2是否是指针:
    MyClass*ptr1,ptr2@Vite Falcon:这就是为什么没有人在一行上使用多个声明的原因。@DeadMG这不是为什么没有人在一行上使用多个声明的原因。这甚至不是任何人都不应该使用多个声明的原因。这只是因为人们并不完全了解语法。当我合乎逻辑地说,我的意思是,这就是我们(人类)如何联系事物,但这是否意味着这就是它应该是什么样子?我指出了Dennis他所做的声明
    大家都知道星号属于类型,而不是变量。
    是错误的,因为在声明中它确实属于类型。