Warum ist in der Definition des Kopierzuweisungsoperators ein Löschen erforderlich?
Ich bin ein C ++ Anfänger. Und ich mache die Übungen in C ++ Primer (5th Edition). Ich fand einen Verweis auf Übung 13.8 von Github Hie), die unten gezeigt wird.
#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();
}
Was mich verwirrt, ist dasHasPtr& operator=(const HasPtr &hp)
Funktion. Ich weiß nicht warumdelete ps;
wird hier benötigt. Ich dachte, dass es ein Fehler war, aber es funktionierte, als ich den Code kompilierte. Es funktioniert jedoch auch, wenn ich die Zeile von @ löschdelete ps;
. Also, ich weiß nicht, obdelete ps;
wird benötigt und was ist der Vorteil, wenn es reserviert ist.