C 自賦值與異常安全問題

2022-05-09 03:09:10 字數 1595 閱讀 3691

這個講的很不錯!

因為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技術.

class

menu;

void menu::changebg(istream&src)

reset函式中會delete掉原來的空間,但是如果new失敗了,並不會進入reset函式,不會對bg產生影響。(但也有問題,但之後的敘述不明白。)

class

menu;

menu::changebg(std::istream&src)

先對原來的物件做乙個拷貝,然後修改拷貝物件,再swap,函式結束時,copy物件及其指向的記憶體會被釋放,不會造成洩露。

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 相對而言是不可信的,如果我們把一些重要的資訊,例如...