首頁  >  問答  >  主體

内存管理 - C和C++申请和释放内存问题

C和C++什么东西在什么时候要申请内存和释放内存(我知道的指针要释放,用delete释放)?怎么申请怎么释放?
问一个具体的问题,请不要鄙视我。Object obj;Object* obj = new Object();两种情况下,不用的时候我要释放它吗?怎么释放?
还有一个问题,比如我的对象成员有一个字符串类型的或者指针类型的变量,我在释放这个对象之前要先释放成员吗?这一步是不是必须的?

阿神阿神2765 天前692

全部回覆(4)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:18:49

    假設用到C風格的字串char*,一般是需要自己分配記憶體的,申請當然是使用new然後釋放使用delete咯。
    如果沒有用到new,這一部分記憶體空間就是在堆疊上開闢的,就不需要管記憶體釋放的問題,如果是想這樣子

    Object* obj = new Object();
    

    這裡的obj當然要使用delete釋放內存,或者可以使用智能指針幫你管理這一部分內存,這樣就不用手動的調用delete了
    如果你的對像有一個指針類型的成員變量,一般情況下你只需要把釋放記憶體的步驟寫到析構函數裡面就是了,就是把delete的步驟寫到析構函數裡面。
    一般來說釋放成員指標變數的記憶體是必須的,因為不釋放那就是洩漏了。
    不過注意這裡使用成員指針有一個坑,當你需要拷貝這種類型的對象,需要你正確重載拷貝構造函數,否則會造成double free的錯誤。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 13:18:49

    當然要用的時候申請記憶體不用的時候釋放記憶體。
    用指標就會崩潰當然就不要用裸指標了,C++裡那麼多智慧指標乾嗎不用呢?
    以你評論裡的程式碼為例,你寫成這樣就不糾結了:

    std::unique_ptr<Object> ptr(new Object(...));
    ptr->...

    然後你就不用寫delete了,而且這個ptr超出作用域之後new出來的Object也自動乾掉了。
    多好。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 13:18:49

    Object obj;這種方式物件是在堆疊空間不需要自己手動去釋放,函數棧執行完會自動釋放.
    Object* obj = new Object();這種方式需要手動釋放.delete obj就行了.
    至於你說的obj中存在指針這種方式, 我想你學面向對象肯定學過析構函數吧,調用delete obj的時候其實就是會事先調用析構函數,在析構函數中將指標成員free(或delete)掉就行了

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:18:49

    自己申請的記憶體都需要自己釋放。一般在需要可變的空間時動態申請

    回覆
    0
  • 取消回覆