題目(15):運行下圖中代碼,輸出的結果是什么?這段代碼有什么問(wèn)題?
#include
class A
{
public:
A()
{ std::cout << "A is created." << std::endl; }
~A()
{ std::cout << "A is deleted." << std::endl; }
};
class B : public A
{
public:
B()
{ std::cout << "B is created." << std::endl; }
~B()
{ std::cout << "B is deleted." << std::endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
A* pA = new B();
delete pA;
return 0;
}
答案:輸出三行,分別是:A is created. B is created. A is deleted。用new創(chuàng )建B時(shí),回調用B的構造函數。在調用B的構造函數的時(shí)候,會(huì )先調用A的構造函數。因此先輸出A is created. B is created.
接下來(lái)運行delete語(yǔ)句時(shí),會(huì )調用析構函數。由于pA被聲明成類(lèi)型A的指針,同時(shí)基類(lèi)A的析構函數沒(méi)有標上virtual,因此只有A的析構函數被調用到,而不會(huì )調用B的析構函數。
由于pA實(shí)際上是指向一個(gè)B的實(shí)例的指針,但在析構的時(shí)候只調用了基類(lèi)A的析構函數,卻沒(méi)有調用B的析構函數。這就是一個(gè)問(wèn)題。如果在類(lèi)型B中創(chuàng )建了一些資源,比如文件句柄、內存等,在這種情況下都得不到釋放,從而導致資源泄漏。
博主何海濤對本博客文章享有版權。網(wǎng)絡(luò )轉載請注明出處http://blog.csdn.net/cadcisdhht
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/