2013-06-27 71 views
2

我有一個問題,刪除類的析構函數內的類屬性,如果我嘗試在一個經典的過程程序中做同樣的事情,它完美的作品。刪除在析構函數中不起作用?

但是,如果我試圖執行析構函數下面的代碼不delete「陣列」,不釋放內存:

class MyClass 
{ 
private: 
    int *array; 
    int n = 2000000; 
public: 
    MyClass(){ 
     this->array = new int[n]; 
     for(int i=0; i<n; i++){ 
      array[i] = i; 
     } 
    } 
    ~MyClass(){ 
     delete[] array; 
    } 
}; 


int main(int argc, const char * argv[]) 
{ 
    MyClass *test = new MyClass; 

    delete test; 

    return 0; 
} 

爲什麼?

+1

爲什麼不使用'std :: vector'來代替? –

+4

僅僅因爲內存不會立即返回到操作系統,並不意味着內存不會在應用程序「堆」中被釋放。 –

+2

內存被*標記爲空閒,但不會從該進程中未映射。其中一個原因是因爲未來分配內存的速度會更快,因爲操作系統不必將新頁面映射到進程。如果另一個進程迫切需要這些內存頁面,它們將被重新映射。 –

回答

3

當您使用new或malloc分配內存並將其釋放後,它並不意味着內存將返回到操作系統。實現可以保持內存和隨後對malloc或new的調用可以使用此內存,以避免再次從操作系統分配內存的開銷。

8

**Don't worry!** (should I say _'Don't Panic'_?)

如果執行在類的析構函數的聲明delete,在構造函數中分配的內存將被釋放,可供將來使用。

這並不意味着操作系統爲實例化您的類的實際進程分配的內存將會減少。

作爲附加提示:要檢測程序中的「真實」內存泄漏,請使用合適的工具,如Valgrind或類似。