在學習《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; }
上述代碼編譯和運行均不會產生錯誤。