在學習《C++primer 第五版》(中文版)中第12章動態記憶體與智能指標的時候遇到了一個習題,練習12.13:
練習 12.13:如果執行下面的代碼,會發生什么?
auto sp=make_shared<int>();
auto p=sp.get();
delete p;
上述代碼創建了一個指向int的空智能指標sp,然后呼叫get()創建了一個指向int的普通指標p,隨后delete普通指標p,
但看這三行代碼,會認為題目考察delete一個空指標時會發生什么事情,但是結合書中本章節的內容(本章講智能指標和動態記憶體管理)并考慮實際運行會得出本體的答案:這三行代碼是編譯安全的(本人使用gcc 9.3.0),但是在運行期,由于delete首先釋放了智能指標所指向的記憶體(即使為空指標),但是此時sp的參考計數并沒有改變(),導致sp離開此作用域時,智能指標sp再次釋放指向的記憶體空間,此時會產生錯誤
double free or corruption
我們如果考慮第一種問題,delete作用于一個空指標會發生什么,答案是什么也不會發生,delete會自動判斷指標是否為空指標,如果是空指標則delete不執行任何操作
為了驗證我們就可以多次delete一個空指標(實際不要這么做,很無聊)
int main() { int *p; delete p; delete p; return 0; }
上述代碼編譯和運行均不會產生錯誤,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280167.html
標籤:其他
上一篇:pandas(9):排序
下一篇:IDE 常用配置
