Code tak od jednej z moich książek na przykład:Dlaczego muszę usuwać zasoby podczas korzystania z operatora przypisania kopiowania?
class HasPtr {
public:
HasPtr(const HasPtr& h): ps(new std::string(*h.ps)), i(h.i) { }
HasPtr(const std::string &s = std::string()): ps(new std::string(s)), i(0) { }
HasPtr& operator=(const HasPtr&);
~HasPtr() { delete ps; }
private:
std::string *ps;
int i;
};
HasPtr& HasPtr::operator=(const HasPtr &rhs){
auto newp = new string(*rhs.ps); // copy the underlying string
delete ps; // free the old memory
ps = newp; // copy data from rhs into this object
i = rhs.i;
return *this; // return this object
}
Wydaje się wewnątrz operatora = może być tylko:
*ps = *rhs.ps
i = rhs.i
return *this;
Bez konieczności najpierw skasować wskaźnik, wydaje się zbędne aby to zrobić. Wspomniał on, że jest napisany w taki sposób, aby pozostawić obiekt w odpowiednim stanie, gdyby wystąpił wyjątek, ale nie ujawniłby go poza tym, ale nie widzę, jaki wyjątek mógłby wystąpić, nawet gdyby moja alternatywa nie poradziła sobie z nim. Dlaczego trzeba najpierw usunąć obiekt przed przypisaniem?
Trzeba przestrzegać zasady trzech [] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) (który jest trywialnie obserwowany przez przestrzeganie [reguły zerowej] (http://stackoverflow.com/q/22806523/315052)). Używaj również funkcji kopiowania i wymiany (http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom), jeśli wdrożysz własny operator przypisania. – jxh
Która książka? –
@LightnessRacesinOrbit C++ Primer Edycja 5th, Rozdział 13.2.1 – AntiElephant