Почему удаление необходимо в определении оператора копирования-назначения?

Я новичок в C ++. И я делаю упражнения в C ++ Primer (5-е издание). Я нашел ссылку на Упражнение 13.8 от Github (Вот), что показано ниже.

#include <string>
#include <iostream>

using std::cout;
using std::endl;

class HasPtr {
public:
    HasPtr(const std::string &s = std::string()) : ps(new std::string(s)), i(0) { }
    HasPtr(const HasPtr &hp) : ps(new std::string(*hp.ps)), i(hp.i) { }
    HasPtr& operator=(const HasPtr &hp) {
        std::string *new_ps = new std::string(*hp.ps);
        delete ps;          // I don't know why it is needed here? 
                            // But when I delete this line, it also works.
        ps = new_ps;
        i = hp.i;
        return *this;
    }

    void print() {
        cout << *(this->ps) << endl;
        cout << this->i << endl;
    }

private:
    std::string *ps;
    int i;
};

int main() {
    HasPtr hp1("hello"), hp2("world");
    hp1.print();
    hp1 = hp2;
    cout << "After the assignment:" << endl;
    hp1.print();
}

Что меня смущает, так этоHasPtr& operator=(const HasPtr &hp) функция. Я не знаю почемуdelete ps; нужен здесь. Я думал, что это ошибка, но она сработала, когда я скомпилировал код. Тем не менее, это также работает, когда я удаляю строкуdelete ps;, Итак, я не знаю,delete ps; нужен и в чем преимущество, если оно зарезервировано.

Ответы на вопрос(4)

Ваш ответ на вопрос