比方說有它指向一個基類對象的基類指針:C++面試問題涉及到類指針
baseclass *bptr;
bptr= new baseclass;
現在如果我做
bptr= new derived;
這裏是什麼問題?
比方說有它指向一個基類對象的基類指針:C++面試問題涉及到類指針
baseclass *bptr;
bptr= new baseclass;
現在如果我做
bptr= new derived;
這裏是什麼問題?
您正在重新分配指針而不釋放爲先前對象分配的內存。如果沒有其他人在重新分配之前已經存儲了bptr
的值,則可能導致內存泄漏。
在第一行中,您聲明瞭一個指針。 在第二行中,您在內存中給它一個參考。第3行中的 ,您在內存中給IT另一個參考。
您給指針的第一個引用泄露了......您永遠無法取回它。
請問baseclass
有一個虛擬析構函數嗎?如果不是,那也可能不好(除了明顯的泄漏)。
除了明顯的內存泄露,它取決於baseclass
和derived
定義的一些問題可能是:
derived
不公開從baseclass
衍生的(如果是的話這是一個可怕的問題要問在採訪)baseclass
沒有虛析構函數(在這種情況下,它是不安全的delete bptr;
)當時他試圖去Circle Ellipse problem?如果派生是基類的專門化,則基類上的某些公共方法可能不再具有含義,例如如果Circle是從Ellipse派生而來的,Ellipse有一個叫做stretch()的方法,它將橢圓拉伸到一個軸上,當在Circle的一個實例上調用方法時,你會怎麼做?
如果類析構函數未定義爲虛擬,則會出現唯一問題。在這種情況下,它會導致內存泄漏
存在沒有語法問題但是您正在通過爲「bptr」變量分配新值來釋放「baseclass」實例的地址。這會導致內存泄漏,因爲第一個實例類的地址丟失。
如果我是你,我會回頭,問面試官幾個問題:
而且,請有虛擬析構函數等等,只有當你有類定義時纔會到位。也許面試官正在偷偷尋找透視型的。
Arpan
+1,有時問題也可以是答案.. :) – liaK 2010-06-10 10:11:25
這裏有什麼問題嗎?
如果(「內存泄漏」)的答案是不能接受的,問題是,不論是問題或面試;)
我會回答,像這樣這樣的面試問題:
從有限的代碼片斷中可以清楚地看到,當我們將指針指派給此派生類的實例時,會發生內存泄漏,因爲我們沒有其他指針訪問基礎對象。然而,如果沒有看到兩個類的定義,並且看到這兩個類之間的關係,就不可能說明代碼段。
你有沒有這個或類的聲明? – Nikko 2010-06-10 07:49:21
我打算採用不一致的命名方案。如果你有邏輯上的'baseclass',你也會有'derivedclass'。此外,間距是各種各樣的錯誤。 *每個人*都知道星號屬於類型,而不是變量。 – 2010-06-10 08:02:24
@ Dennis邏輯上,星號屬於該類型,但在語法上屬於該變量。試試這個,告訴我ptr2是否是一個指針:'MyClass * ptr1,ptr2;'。 – 2010-06-10 09:26:40