Effective c++條款11:在operator=中處理“自我賦值”

init_bin發表於2020-11-14

目錄

1.不安全的operator=版本

2.安全的operator=版本


1.不安全的operator=版本

class bitmap{

};

class widget{
	
	widget& operator=(const widget& rhs){
		delete pb;
		pb = new bitmap(*rhs.pb);
		return *this;
	}

private:
	bitmap* pb;
};

自我賦值的不安全:這裡的rhs物件如果和this指向的物件是同一個,那麼先進行了delete pb, 相當於給rhs.pb此時也指向了一塊已刪除的物件。這是不安全的。

異常不安全:這裡new操作,或bitmap的拷貝建構函式呼叫發生異常,那麼此時this->pb指向了一塊已刪除的物件。這也是不安全的。

2.安全的operator=版本

class bitmap{

};

class widget{
	
	widget& operator=(const widget& rhs){
		bitmap* tmp = pb;
        pb = new bitmap(*rhs.pb);
        delete tmp;
        return *this; 
	}

private:
	bitmap* pb;
};

這裡做了一個備份,並且在最後才刪除之前this->pb所指向的物件,所以可以處理自我賦值的不安全問題。而且即使此時new那一段語句丟擲異常,此時pb仍能保持原有的指向,解決了異常不安全問題。

注:copy與swap技術也能用來解決這種自我賦值與異常安全問題。

class bitmap{

};

class widget{
	
    void swap(widget& rhs){
        //交換
    }

	widget& operator=(const widget& rhs){
		widget temp(rhs);
        swap(temp);
        return *this;
	}

private:
	bitmap* pb;
};

參考 《Effective c++》

 

相關文章