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的析构函数,申请的内存没有释放
造成了内存泄漏