2015-07-06 33 views
1

我有一個關於C++內存管理的問題。據我所知,沒有必要在Java中取消分配內存,因爲未使用的對象有時會被JVM垃圾回收器清除。我的觀點是,如果我忘記使用C++釋放內存,那麼在我重新啓動機器並且內存中的數據丟失之前,已使用的內存地址將被佔用?例如,在下面的代碼我有一個簡單的鏈表,你可以看到,我不釋放內存(在析構函數評論):如果我忘記釋放C++中的內存會怎麼樣

#include <iostream> 
using namespace std; 

typedef struct Node{ 
Node* next; 
int id; 
} *ListPtr; 
class LinkedList{ 
public:`ListPtr header; 

LinkedList(){ 
    header = NULL; 
} 
~LinkedList(){ 
    /* 
    ListPtr a = header,b; 
    while(a != NULL) 
    { 
     b = a; 
     a = a -> next; 
     delete b; 
    } 
    delete a,b; 
    cout << "Memory freed!"<< endl; 
    */ 
} 

public: void Insert(){ 
    ListPtr new_element = new Node; 
    new_element -> next = NULL; 

    if(header == NULL){ 
     header = new_element; 
     header -> id = 0; 
    } 
    else{ 
     new_element -> next = header; 
     new_element -> id = header -> id + 1; 
     header = new_element; 
    } 
} 

public: void Print(){ 
    ListPtr curr = header; 
    while(curr != NULL){ 
      cout << "[" << &curr -> id << "]" << "-->"; 
     curr = curr -> next; 
    } 
    cout << "[NULL]"<<endl; 
}}; 

int main(){ 
LinkedList list; 
list.Insert(); 
list.Insert(); 
list.Insert(); 
list.Insert(); 
list.Insert(); 
list.Print(); 
return 0; 
} 

這是否意味着那些內存地址將被佔用,直到我關機了?程序執行完成後,變量(如整數)會發生什麼情況?我可以釋放他們嗎?

本方案的輸出是: [0x8622ac] - > [0x86229c] - > [0x86228c] - > [0x86227c] - > [0x8615bc] - > [NULL]

+0

[當你在malloc之後沒有自由時真的會發生什麼?](http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc ) –

+0

如果您使用標準容器開始 - 例如'std :: string','std :: vector','std :: set' - 如果你通過「value」存儲元素,他們會自動管理和釋放內存。當你必須使用指針來跟蹤或以其他方式處理元素時,首選「智能指針」,它可以執行所有權/生命週期模型並避免泄漏:特別是,C++ 11標準庫提供'std :: unique_ptr'和'std :: shared_ptr'這非常有用。 –

回答

4

這取決於操作系統。大多數現代操作系統都會跟蹤每個進程分配的內存,因此當進程退出時,進程分配的所有內存都應該釋放。

但是,你與他們完成後會導致泄漏,在記憶的情況下,你將有內存沒有釋放資源泄漏。對於長時間運行的流程,這些泄漏可能會累積,直到所有資源用完。


的內存等資源被自動釋放進程終止即使,它往往還是考慮好作風退出過程之前顯式釋放分配的資源。

+0

謝謝!這是我正在尋找的解釋! –

1

C++沒有Java那樣的垃圾收集器,程序員有義務釋放動態分配的內存。操作系統會在應用程序終止時清除爲應用程序分配的內存,但有些情況下必須由編程人員執行釋放,否則會導致內存泄漏。

#include <iostream> 
using namespace std; 
class test { 
    public: 
    int cl; 
}; 

int main() 
{ 
    test *p; 
    p=new(test); 
    p->cl=5; 
    return 0; 
} 

當上述程序結束,將釋放指針p,但儘管該整數不再訪問不會被釋放p指向的整數。

1

除非您正在使用某種精簡的實時操作系統,否則在進程退出時系統無法恢復所有內存的可能性極小。

也就是說,不要指望這種行爲是一個好習慣。例如,您可以在您的構造函數/析構函數中包含已分配對象的計數。如果它們在程序退出之前全部歸零,則可以很好地檢查內存泄漏。如果這些計數是非零的,你就會在某處發生內存泄漏。

相關問題