這個講的很不錯!
因為cpp中有指標和引用,它們可以指向同乙個變數,所以會存在自賦值的問題。
a[i] = a[j]; //自賦值一般存在:自賦值安全和異常安全,兩個問題,例如:@ 如果i和j有同樣的值,這裡就是一次自賦值
*px = *py; //
@ 如果px和py指向相同的東西,這裡就是一次自賦值
widget& widget::operator=(const widget&rhs)當是自賦值的時候,pb已經先被刪除了,那麼後面的new就會為空,這是未知的計算。
異常安全是指當異常發生時:
通常有三個異常安全級別:基本保證、強烈保證、不拋異常(nothrow)保證。
widget& widget::operator=(const widget&rhs)這個自賦值安全,但是沒有異常安全,如果new處出現了異常,那麼pb仍舊指向空。
widget& widget::operator=(const widget&rhs)這裡用po指向原來的動態空間,在new時如果失敗了丟擲bad alloc異常,那麼pb仍然指向原來的空間,不會懸空。
通過乙個中間變數來實現,而沒有使用if的判斷,因為可能會影響效率。
其實也可以這樣:
hasptr & operator=(const hasptr&hp)主要就是申請乙個臨時變數來指向原來的空間或者是新申請的空間。//delete應該是不會出現異常的吧。
widget& widget::operator=(widget rhs)注意引數為值拷貝,在cpp459頁有講解,
總結:
判斷兩個位址是否相同
仔細地排列語句順序
copy and swap
自賦值存在的知識點差不多這些。
**:但其實異常安全問題不僅僅存在於自賦值中,上述連線中給的例子,在更新資料成員時,也可能會出現異常安全的問題:
void menu::changebg(istream&src)當要更新bg時,new出現了問題,則mutex資源洩露,bg變為空懸指標。
針對這個問題,當然這個和自賦值問題是不同的,可以將資料成員bg用智慧型指標來管理,也可以使用copy&swap技術.
classreset函式中會delete掉原來的空間,但是如果new失敗了,並不會進入reset函式,不會對bg產生影響。(但也有問題,但之後的敘述不明白。)menu;
void menu::changebg(istream&src)
class先對原來的物件做乙個拷貝,然後修改拷貝物件,再swap,函式結束時,copy物件及其指向的記憶體會被釋放,不會造成洩露。menu;
menu::changebg(std::istream&src)
C安全問題與指標誤用
考慮如下的宣告 int ptr1,ptr2 ptr1為指標,ptr2為整數 正確的寫法如下 int ptr1,ptr2 用型別定義代替巨集定義是乙個好的習慣,型別定義允許編譯器檢查作用域規則,而巨集定義不一定會。使用巨集定義輔助宣告變數,如下所示 define pint int pint ptr1,...
C 執行緒安全問題
如果你的 在程序中有多個執行緒同時執行一段 如果每次執行的結果都和單執行緒執行時的結果一致,那麼就是執行緒安全的 先看下面兩段 執行結果是否一樣?int num1 0 int num2 0 for int i 0 i 1000 i for int i 0 i 1000 i console.write...
Cookie安全問題與防範
那麼不正確地使用 cookie 有哪些安全問題呢?cookie篡改 這是最容易出現的情況,也就是直接修改 cookie 的內容。我們知道,cookie 是儲存在客戶端的,所以裡面的內容可以通過瀏覽器的控制台或者 js 進行修改的。因此 cookie 相對而言是不可信的,如果我們把一些重要的資訊,例如...