c++ primer:如果所寫的類要充當基類,那麼,這個類的析構函數就必須聲明爲虛擬函數,否則可能造成內存泄漏。
造成內存泄漏的例子:
有如下兩個類,類pet是基類,類dog繼承了類pet
class pet
{
}
class dog : public pet
{
dog(const char * =NULL);
~dog();
}
dog::dog(const char * p)
{
if (p==NULL)
{
m_name=new char;
if (m_name==NULL)
{
exit(0);
}
*m_name='\0';
}
else
{
m_name=new char(strlen(p)+1);
if (m_name==NULL)
{
exit(0);
}
strcpy(m_name,p);
}
}
dog::~dog()
{
delete[] m_name;
m_name=NULL;
return;
}
有如下程序:
pet *mypet= new dog();//生成了一個dog對象,調用了dog的構造函數,申請了內存m_name;
delete mypet;//靜態調用了類pet的析構函數,並沒有調用dog的析構函數,申請的內存沒有釋放
造成了內存泄漏