我正在阅读C ++入门第13章“类继承”,关于派生类中的赋值运算符让我感到困惑。情况如下: 在基类:
class baseDMA
{
private:
char * label;// label will point to dynamic allocated space(use new)
int rating;
public:
baseDMA & operator=(const baseDMA & rs);
//remaining declaration...
};
//implementation
baseDMA & baseDMA::operator=(const baseDMA & rs)
{
if(this == &rs)
{
return *this;
}
delete [] label;
label = new char[std::strlen(rs.label) + 1];
std::strcpy(label,rs.label);
rating = rs.rating;
return *this;
}
// remaining implementation
在派生类
中class hasDMA : public baseDMA
{
private:
char * style;// additional pointer in derived class
public:
hasDMA & operator=(const hasDMA& rs);
//remaining declaration...
};
// implementation
hasDMA & hasDMA::operator=(const hasDMA & hs)
{
if(this == &hs)
return *this;
baseDMA::operator=(hs);
style = new char[std::strlen(hs.style) + 1];
std::strcpy(style, hs.style);
return *this;
}
// remaining implementation
我的问题是:在派生类赋值运算符定义中,为什么在为其分配新空格之前不需要首先删除样式(如删除baseDMA中的标签)?
谢谢。
答案 0 :(得分:0)
此时style
有一个指针,你可以从之前调用new char []开始设置。如果你指定它,你就失去了调用delete []的最后机会,并造成内存泄漏。
作为一个重要的注释,将您展示的代码视为一个概念的演示。通常你不应该直接做这样的事情,但是有一个专门从事任务的成员,而外部类根本不需要dtor或op =。就像您的示例一样,标签和样式可以是std :: string,唯一需要手工制作的dtor和op =是std :: string!