動態內存:delete作用於空指針


  

  在學習《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;
}   

 

  上述代碼編譯和運行均不會產生錯誤。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM