今天突然想到一個(gè)問(wèn)題未桥,詳情看代碼吧。
奇怪的問(wèn)題
#include <stdio.h>
#include <iostream>
class A
{
public:
A() { std::cout << "i am A." << std::endl; }
~A() { std::cout << "release A." << std::endl; }
};
class B : public A
{
public:
B() { std::cout << "i am B." << std::endl; }
~B() { std::cout << "release B." << std::endl; }
};
執(zhí)行如下代碼:
A *pA = new B();
delete pA;
此時(shí)看到的log如下:
i am A.
i am B.
release A.
那么芥备,這個(gè)時(shí)候冬耿,class B
的析構(gòu)函數(shù)沒有被調(diào)用到,(在class B
的對(duì)象中包含其他對(duì)象萌壳,或者不包含其他對(duì)象的情況下)這樣會(huì)導(dǎo)致內(nèi)存泄漏嗎亦镶?
避免上面的問(wèn)題
對(duì)于上面問(wèn)題,在不確定是否會(huì)導(dǎo)致內(nèi)存泄漏前袱瓮,寫代碼的時(shí)候可以注意將class
的析構(gòu)函數(shù)寫為虛函數(shù).示例如下:
#include <stdio.h>
#include <iostream>
class A
{
public:
A() { std::cout << "i am A." << std::endl; }
virtual ~A() { std::cout << "release A." << std::endl; }
};
class B : public A
{
public:
B() { std::cout << "i am B." << std::endl; }
~B() { std::cout << "release B." << std::endl; }
};
再執(zhí)行如下代碼:
A *pA = new B();
delete pA;
看到的log就是這樣了:
i am A.
i am B.
release B.
release A.
解答
還沒有答案咯缤骨。