2008-11-20 77 views
2

好吧,我正在處理別人的密碼。他們做了很多:擦除一個字符[]

char description[256]; 
description[0]=0; 

我知道這會在字符數組的第一個位置放一個\ 0。但是,這甚至是擦除字符串的安全方法嗎?

此外,Visual Studio不斷報告內存泄漏,我幾乎把這一切都與所使用的字符串聯繫在一起。

Ps。是的,我知道std :: string,是的,我使用它。這不是我的代碼。

+0

請澄清一下「我已經把這件事完成了與所使用的字符串綁定」?我無法完全解析它... – Arkadiy 2008-11-20 18:27:00

回答

8

初始化字符串爲0,你可以這樣做:

char description[256] = {0}; 

將分配0到陣列中的每個元素。

僅將第一個元素設置爲0'\0')不會清除其內容。它甚至不保證整個字符串被設置爲空字符。

正如其他人所說的那樣,在函數關閉之前,您不能「清除」靜態創建的對象,直到函數關閉爲止。從技術上講,當函數被放棄時它不會被擦除 - 堆棧指針只是被改變。如果您對正在擦除的數據偏執,則應該遍歷數組,將每個條目設置爲0'\0')。

4

該字符串被分配到堆棧中,所以沒有辦法釋放它使用的內存,直到它被調用的函數返回(當它自動發生時)。除非您以遞歸方式調用此函數*,否則這將不會成爲內存泄漏,因爲一旦函數返回該空間將用於將來的堆棧幀。如果你關心安全性,你應該循環並清零字符串的元素。

如果你想要一個自由() - 能內存塊,你可以做以下,並在堆上分配數組:

char *str = malloc(256*sizeof(char)); // str now is a pointer to a 256-char array 
... 
// some code here 
... 
free(str); // free the memory 

*這不是一個acutal內存泄漏,但也有人說「內存泄漏「,當他們的意思是」內存不足「。在任何情況下,堆棧空間都比堆空間有限得多,所以你必須觀察你在那裏使用的內存塊的大小。

+0

即使在遞歸調用時也不會發生內存泄漏(遞歸中可能存在導致內存不足的錯誤,但我不會將其描述爲「泄漏」,本身)。 – 2008-11-20 13:57:02

+0

是的,但有時候人們會說「內存泄漏」,意思是「我的內存不足」 – 2008-11-20 13:57:51

3

字符串中的第一個元素把\0是一種安全的方式來明確字符串,但那是不一樣的刪除字符串,並不會阻止內存泄漏。

1

如果它是一個char []字符串,並且對它執行的唯一操作是字符串函數,那沒問題。當然,對於受保護的數據來說還不夠好。對於內存泄漏,可能需要更改爲字符串函數的安全版本,但不能泄漏靜態或基於堆棧的字符串,因此可能是您的字符串被傳出的地方。

爲了清楚起見,我會將其更改爲'\ 0'。

8

將char數組的第一個元素設置爲\ 0足以確保'description'是格式正確的實際字符串。元素1到255都可以是垃圾,只要元素0是0,description是一個零長度的字符串。

你不必擔心上面發佈代碼中的內存泄漏,因爲數組是分配在堆棧上的。一旦它脫離堆棧(超出範圍),char數組將被釋放。

4

爲了澄清到目前爲止給出的很好的答案:

  • 是,描述[0] = 0,則來自strxxx功能POW字符串:strlen的(介紹)== 0,的strcmp(介紹 「」 )== 0和std :: string(description)==「」都是真的。

  • 不,描述[0] = 0與free(description)或memset(description,0,sizeof description)不是一回事。但你已經知道了。

  • 你引用的那段代碼不可能導致內存泄漏。內存不在堆上分配,而內存泄漏是堆事情。