為什麼在過載operator=時需要檢測自賦值情況呢?
書上說是不檢測的話很危險,能不能舉例子說明??
paris_luo的意思是這樣:
string::operator=(const string& src)
在自賦值發生的時候,**中的data和str.data其實是同乙個,那麼在第二句中就訪問了在第一句中已經釋放了的記憶體(strlen(str.data),str.data已經釋放),這種操作是很危險的。
不過即使沒有自賦值的問題,這段**也有問題:
在data = new char...時是可能產生異常的,然後物件中的data將指向一段沒有釋放的記憶體,這個物件已經不能正常工作,甚至不能正常析構。如果在deletedata之後加一句data = null雖然可以解決這個問題,但仍然不好——這樣只是保證了物件能使用而沒***物件狀態,乙個好的賦值操作符應該在產生異常時保持物件狀態與未賦值前一樣。正確的實現應該是:
string::operator=(const string& src)
delete data;
data = newdata;
return *this;
}
這個實現大家可以看到:即使自賦值發生了,仍然不會有問題,只不過做了一些不必要的操作罷了。所以pari_luo這個例子並不能說明問題,它在解決了異常安全問題之後就不存在自賦值問題了。
Item 11 賦值函式的自賦值
class widget widget w w w 1.能通過編譯,但是明顯不合理!a i a j 2.ij可能相同 px py 3.二者可能相同或有繼承關係 上面的三種情況,都是給自己賦值,要在賦值時檢查。class bitmap class widget 既無賦值安全性,又無異常安全性的函式 w...
檢測到客戶端提交危險的Form
在使用ckeditor等html文字編輯器的時候,容易出現 危險的form.這是asp.net預設對xss攻擊的防範。如果在vs2008及以前的版本開發時,直接在.aspx檔案頭中加入這句 page validaterequest false 如果是在vs2010開發環境下,還需要修改web.con...
呼叫caffemodel中的權重賦值給自己的網路
呼叫預訓練好的caffemodel,將其權重賦值給自己網路中的對應層。基本思路比較簡單,三步走 1 載入預定義的caffemodel 2 載入要訓練的網路 3 將預訓練model的引數賦值給要訓練的網路。import caffe import numpy as np import math 載入預訓...