2008-10-11 63 views
1

如何釋放我用於C中的變量(例如長字符串)的內存?如何釋放已用於C中變量的內存?

+0

可以使用一些說明。你動態分配了這個內存嗎?或致電圖書館爲你做了嗎?你是否試圖回收與自動或靜態變量相關的內存? – dmckee 2008-10-11 18:57:14

回答

13

假設您動態分配內存(使用malloc或另一個內存分配程序),請使用free釋放內存。如果內存是靜態分配的,則不能釋放它。

+0

詛咒!再次挫敗!請注意,某些標準庫函數調用malloc或calloc,並將釋放內存的責任留給調用者。 – dmckee 2008-10-11 18:47:50

+0

@dmckee:可能有第三方或平臺API要求您釋放()他們返回的塊,但我不知道任何標準庫函數(除了分配的函數 - malloc,calloc和realloc)做這個。 – 2008-10-12 00:22:24

1

這真的取決於你如何聲明你的變量 - 如果它是一個普通的變量,你不能「取消分配」它的內存 - 當它失控的範圍,想在這裏將被釋放:

for (int i=0;i<10;i++) { 
int k=i; 
//do stuff 
} 

我會當你退出循環時解除分配,並且在循環體中的每一次通過時,k都將被分配和釋放。

當它是關於運行時的內存分配,您可以使用您值得信賴的malloc和free :)

int* intArray; 
malloc(200 * sizeof(int)); 

這會給你的200個整數數組。

1

假如你不使用malloc,並創建一個字符串或使用

char array[100]; 

緩衝區,但你知道,你只使用了很長一段的功能很短的一部分,你可以將該部分功能放在另一組{

int reallylongfunction() { 
    // Do a lot of stuff 
    { 
     char stringbuffer[100]; 
     // Do stuff with the buffer... 
     // Ok, we're done with the buffer, and don't want it anymore 
    } 
    // Do a lot more stuff 
    return; 
} 

這將導致緩衝區超出範圍並被釋放。但要小心,在額外{}內部聲明的任何內容都將超出範圍並消失!

編輯:該死,評論是正確的。超出範圍的靜態字符串沒有任何好處。編輯所以它只是一個數組。

0

我建議你看看ustr,這是一個字符串API,你可以使用自動,常量和動態分配的字符串......其中只有兩個實際上可以「釋放」,但所有這些你可以用同樣的方式處理並傳給ustr_free()。

您可能仍然想了解堆棧,堆和數據(RO文本字符串)是如何「分配」和「釋放」的......但使用可用的API,而您正在學習這將停止幫助您你很多(並且將比你自己做的要快得多)。

1

這個問題真的不能沒有更多的信息回答。知道如何釋放對象(甚至知道它是否應該被釋放)的唯一方法是知道對象是如何分配的。

當我說對象,我的意思是不只是一個C++「對象」,但作爲在C標準用於「對象」:

數據存儲在 執行環境的

區域,所述內容 它可以代表值