我得到的提示是,对于具有成员变量指针的类,我需要注意在分配时对它们进行适当的内存管理。以下方法旨在避免内存泄漏:
class SomeClass {
SomeClass& SomeClass::operator =(SomeClass& from) {
// clone
if (&from != this) {
this->dispose();
this->clone(from);
}
return *this;
}
void SomeClass::clone(const SomeClass& from) {
this->array = from.array;
}
void SomeClass::dispose() {
delete[] this->array;
}
};
假设到目前为止这是正确的,是否可以执行以下操作:
定义一个实现Object
的超类operator=
,并使用抽象方法clone
和dispose
。任何带有指针成员的类都应该Object
作为超类,以便它继承operator=
,并提醒我需要实现clone
和dispose
。
答案 0 :(得分:2)
没有!不要这样做。
首先,将您的operator=()
声明为
SomeClass& SomeClass::operator =(const SomeClass& from);
注意const
。在新的C ++ 11标准中,还有另一种形式,它允许您在示例中显示的移动语义,但随后您将赋值运算符声明为
SomeClass& SomeClass::operator =(SomeClass&& from);
注意&&
。
有关此主题的深入讨论,请查找rule of three或在C ++ 11中rule of five
现在问题,赋值运算符不会被继承。如果未在派生类中定义赋值运算符,编译器将生成默认值并隐藏基类的赋值运算符。因此,您的基类的赋值运算符将永远不会被看到,并且永远不会被派生类的客户端使用。
有关赋值运算符的更多讨论,请参阅示例What is the copy-and-swap idiom?。