所以我有一个union类型结构,它包含一个指向字符串的指针作为union可以容纳的类型之一,我想重载=运算符,这样我就可以进行赋值。为了确保我没有内存泄漏,我正在检查union的类型是否已经是一个字符串,如果是,我删除旧值并分配新值。
我的问题是,如果我执行“aString = aString”,我的检查会删除它意味着分配的字符串,这当然会导致段错误。我知道这不是我需要使用的东西,但我只想确保正确处理这种情况。所以我的问题是如何正确处理?
答案 0 :(得分:1)
要防止自我分配,您必须确保源对象与目标不同。
这就是赋值运算符通常如下所示的原因:
person& person::operator=(const person& rhs)
{
if (this != &rhs)
{
// free the old resources
// and copy from rhs
}
return *this;
}
移动赋值运算符也应该执行此测试(Move assignment operator and `if (this != &rhs)`)。
有时,将赋值运算符更改为按值而不是引用来获取对象可能很有用,因此您不需要检查自我赋值并使用临时对象来移动或交换。