たとえば、私の本の1つからの次のようなコード:
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
}
operator= の内部は次のようになります。
*ps = *rhs.ps
i = rhs.i
return *this;
最初にポインターを削除する必要がないため、削除するのは冗長に思えます。例外が発生した場合にオブジェクトを適切な状態のままにする方法で書かれていることは言及しましたが、それを過ぎて漏らしませんでしたが、私の代替手段でさえ処理できない例外が発生する可能性はありません。割り当てる前に最初にオブジェクトを削除する必要があるのはなぜですか?