假设有一个基类指针指向基类对象:
baseclass *bptr;
bptr= new baseclass;
现在,如果我这样做
bptr= new derived;
这里有什么问题?
答案 0 :(得分:17)
显而易见的答案是你正在泄漏原始的基类对象。
答案 1 :(得分:7)
除了明显的内存泄漏外,它还取决于baseclass
和derived
的定义,其中一些问题可能是:
derived
并非公开源自baseclass
(如果是这样,在采访中提出这是一个可怕的问题)baseclass
没有虚拟析构函数(在这种情况下,它对delete bptr;
不安全)答案 2 :(得分: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)
我会这样回答这个面试问题:
从有限的代码片段中可以清楚地看到,当我们将指针分配给此派生类的实例时会发生内存泄漏,因为我们没有其他指针访问基础对象。但是,如果没有看到两个类的定义,并且看到两个类之间的关系,就不可能再对代码片段说。