2010-06-10 42 views
12

比方說有它指向一個基類對象的基類指針:C++面試問題涉及到類指針

baseclass *bptr; 
bptr= new baseclass; 

現在如果我做

bptr= new derived; 

這裏是什麼問題?

+2

你有沒有這個或類的聲明? – Nikko 2010-06-10 07:49:21

+8

我打算採用不一致的命名方案。如果你有邏輯上的'baseclass',你也會有'derivedclass'。此外,間距是各種各樣的錯誤。 *每個人*都知道星號屬於類型,而不是變量。 – 2010-06-10 08:02:24

+4

@ Dennis邏輯上,星號屬於該類型,但在語法上屬於該變量。試試這個,告訴我ptr2是否是一個指針:'MyClass * ptr1,ptr2;'。 – 2010-06-10 09:26:40

回答

16

顯而易見的答案是,你正在泄漏原始的基類對象。

+0

這是我的答案......其實......但他暗示我還有其他問題,我可以弄清楚。 – Vijay 2010-06-10 07:25:35

+0

沒有其他問題。 – Blindy 2010-06-10 07:27:15

+0

有一件事可能是派生必須實際上是從基礎派生的。 – ckv 2010-06-10 07:28:09

0

您正在重新分配指針而不釋放爲先前對象分配的內存。如果沒有其他人在重新分配之前已經存儲了bptr的值,則可能導致內存泄漏。

1

在第一行中,您聲明瞭一個指針。 在第二行中,您在內存中給它一個參考。第3行中的 ,您在內存中給IT另一個參考。

您給指針的第一個引用泄露了......您永遠無法取回它。

0

請問baseclass有一個虛擬析構函數嗎?如果不是,那也可能不好(除了明顯的泄漏)。

7

除了明顯的內存泄露,它取決於baseclassderived定義的一些問題可能是:

  1. derived不公開從baseclass衍生的(如果是的話這是一個可怕的問題要問在採訪)
  2. baseclass沒有虛析構函數(在這種情況下,它是不安全的delete bptr;
1

當時他試圖去Circle Ellipse problem?如果派生是基類的專門化,則基類上的某些公共方法可能不再具有含義,例如如果Circle是從Ellipse派生而來的,Ellipse有一個叫做stretch()的方法,它將橢圓拉伸到一個軸上,當在Circle的一個實例上調用方法時,你會怎麼做?

0

如果類析構函數未定義爲虛擬,則會出現唯一問題。在這種情況下,它會導致內存泄漏

0

存在沒有語法問題但是您正在通過爲「bptr」變量分配新值來釋放「baseclass」實例的地址。這會導致內存泄漏,因爲第一個實例類的地址丟失。

5

如果我是你,我會回頭,問面試官幾個問題:

  1. 你確定這是唯一可用的代碼段,在這種情況下,我的回答是一個受過教育的猜測,僅此而已。
  2. 是否有基類和派生的某種記憶mgmt計劃?在這種情況下,我們需要查看運營商未提供的新定義。
  3. 如果沒有內存mgmt,那麼是做引用計數的基類或派生智能指針類型?在這些情況下也沒有泄漏。
  4. 如果沒有智能類型,那麼當然這看​​起來像內存泄漏。

而且,請有虛擬析構函數等等,只有當你有類定義時纔會到位。也許面試官正在偷偷尋找透視型的。

Arpan

+0

+1,有時問題也可以是答案.. :) – liaK 2010-06-10 10:11:25

2

這裏有什麼問題嗎?

如果(「內存泄漏」)的答案是不能接受的,問題是,不論是問題或面試;)

0

我會回答,像這樣這樣的面試問題:

從有限的代碼片斷中可以清楚地看到,當我們將指針指派給此派生類的實例時,會發生內存泄漏,因爲我們沒有其他指針訪問基礎對象。然而,如果沒有看到兩個類的定義,並且看到這兩個類之間的關係,就不可能說明代碼段。