C++虛擬析構函數

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的析構函數,申請的內存沒有釋放
造成了內存泄漏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章