重载 = 运算符,使用具有字符串指针的结构

Overloading = operator, with a struct that has a string pointer

所以我有一个联合类型结构,它包含一个指向字符串的指针作为联合可以保存的类型之一,我想重载 = 运算符以便我可以进行赋值。为了确保我没有内存泄漏,我正在检查联合类型是否已经是字符串,如果是,我删除旧值并分配新值。

我的问题是,如果我这样做 "aString = aString",我的检查会删除它意味着要分配的字符串,这当然会导致段错误。我知道这不是我需要使用的东西,但我只是想确保这个案例得到妥善处理。所以我的问题是如何正确处理这个问题?

要防止自赋值,您必须确保源对象与目标对象不同。

这就是赋值运算符通常看起来像这样的原因:

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)`)。

有时更改赋值运算符以按值而非引用获取对象可能很有用,因此您无需检查自赋值并使用临时对象移动或交换。