C++ 中的 delete[] 機制剖析


本文簡單總結了delete[]放在析構函數中VS放在主函數中的區別(針對自己定義類)。

    我們編譯出來的程序運行時是和操作系統打交道的,程序中用到的內存都向操作系統申請,在多任務的操作系統下,不允許普通的程序訪問未分配的內存。操作系統手里有一張表,標明內存中的哪些單元被哪個程序占用了,哪些是空閑的(空閑不一定是空值,我們編寫的程序如果動態變量沒有初始化往往會帶有不定值,就是這個緣故),當程序提出申請,它就把空閑的內存分配給程序。程序運行完后操作系統再把分配給的內存標記為空閑,以供其他程序用。我個人的猜測,執行delete只是將它后面變量的地址告訴給操作系統,操作系統把它手里的那張表給改了,但delete掉的指針沒有變化,還是原來指向的變量的地址值(可以做個小實驗,new出來的delete后指針不會變,但所指向的內存所存放的變量可能就變了;但如果定義另外一個指針,再將另外那個指針賦給當前指針,則delete后,所指向的內存所存放的變量仍然是不變的,因為只是指針的賦值,本質上還是兩個指針)。

測試程序:

#include <iostream>

int main()
{
    int *p;
    int pp=9;
//    p=&pp;         //delete p后,指針所指向的內存還是pp的,pp並沒有釋放,還是9
    p=new int(5);    //delete p后,就是p所指向的內存被標記為空閑了,數據不確定
    cout<<p<<" "<<(unsigned int)p<<" "<< *p <<endl;//1
    delete p;
    cout<<p<<" "<<(unsigned int)p<<" "<< *p <<endl;//2

    return 0;
}

 

  • delete[] 放在主函數中時,是用來釋放對象,執行這條語句會跳到析構函數中(這就是所謂的"在撤銷對象占有的內存之前完成一些清理工作”,析構函數是提供一個在對象刪除前可以釋放這個對象所占有的資源的機會)。如果有多個對象則用delete[] ,單個對象的話直接delete。
  • 跳到析構函數中后,如果析構函數中有delete[] 語句,則釋放這個對象(即this指針指向的當前對象)所擁有的指針成員變量所占用的空間(請注意:成員變量是指針類型時才需要delete,普通的不用(其實也不能,會報錯的啦)),同理,有多個指針成員變量則用delete[] ,只有一個的話則delete即可。

 


免責聲明!

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



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