2015-10-25 37 views
0
int main() { 
    // Will this code cause memory leak? 
    // Do I need to call the free operator? 
    // Do I need to call delete? 
    int arr[3] = {2, 2, 3}; 
    return 0; 
} 
  1. 這是否代碼創建內存泄漏?如何釋放一個陣列中的C/C++

  2. arr住在哪裏?在堆棧或RAM中?

+0

C和C++是兩種完全不同的語言。你在使用哪一個? – Ivan

回答

0

無內存泄漏引起由於arr是局部變量(因此位於堆棧上)和超出範圍達到的main右大括號時。這意味着不需要撥打freedelete

您似乎誤解了術語「RAM」。它只是意味着「隨機存取存儲器」,它可以指任何可隨機存取的存儲器,通常是PC的主存儲器。該堆棧與自由存儲或操作系統的(運行時部分)一樣也是RAM的一部分。

+0

感謝您的澄清。如果我要初始化一個const char * str =「abc」或者char str [] =「abc」,那麼它也會駐留在堆棧上嗎? –

+0

@ Dr.Programmer字符串文字是**不存儲在堆棧上,除非用於像'char str [] =「abc」;'這樣的數組初始化。所以你的第一個例子不在堆棧中,但可能在只讀存儲器中與程序代碼或一些數據一起,你的第二個例子在堆棧中。 – Downvoter

+1

@ Dr.Programmer http://stackoverflow.com/questions/2589949/c-string-literals-where-do-they-go – Downvoter

2

在RAM中的堆棧

不,它不會泄漏內存。 是的,數組通常是「在堆棧上」(即,即使硬件可能不提供對堆棧的直接支持,實現分配局部變量,需要具有堆棧式行爲的地方)。

+0

感謝您的澄清。如果我要初始化一個const char * str =「abc」或者char str [] =「abc」,那麼它也會駐留在堆棧上嗎? –

+0

假設第一個函數在函數內部,指針將被分配爲本地,但是字符串文本將被靜態分配(例如,通常在初始化的數據段中)。在第二部分中,您將擁有靜態分配的字符串文本以及本地分配的數組。在輸入函數(或任何塊)時,字符串文字將用於初始化本地數組。 –

2

在這個程序

int main() { 
    // Will this code cause memory leak? 
    // Do I need to call the free operator? 
    // Do I need to call delete? 
    int arr[3] = {2, 2, 3}; 
    return 0; 
} 

陣列arr是主要功能與所述自動存儲持續時間的局部變量。它在功能完成後會被銷燬。

函數本身在調用它時分配了數組,它將被銷燬並退出函數。

沒有內存泄漏。

您不應該調用C函數free和operator delete []。

如果程序看起來如下方式

int main() { 
    int *arr = new int[3] {2, 2, 3}; 
    //... 
    delete [] arr; 
    return 0; 
} 

,那麼你應該寫的operator delete [],因爲它是在函數中。

+0

刪除操作符如何知道數組的大小? –

+0

@ Dr.Programmer - 可能是魔法。語言標準並沒有說*它如何工作,只是它必須工作。實際上,大小存儲在某個地方,但我們不應該打擾。 –

+0

@ Dr.Programmer通常,它的實現方式是編譯器將一個前綴附加到包含數組中元素個數的內存blcok。 –

1

您必須撥打free僅用於您使用malloc創建的對象,以及delete用於使用new創建的對象。

在這種情況下,你不需要做任何事情,這個變量是自動管理的。一旦超出範圍(即,在這種情況下,在main()的末尾),其內存將自動釋放。

所以:

  1. 沒有,這裏沒有內存泄漏。
  2. 這個問題沒有多大意義。 所有變量都在RAM中。堆棧只是RAM內存的一個特殊部分,它可以快速有效地處理函數調用,自動分配/釋放局部變量等。無論如何,arr是在堆棧上創建的,而使用mallocnew創建的變量據說位於「免費商店」或「堆」上。
+0

感謝您的澄清。如果我要初始化一個const char * str =「abc」或者char str [] =「abc」,那麼它也會駐留在堆棧上嗎? –