簡體   English   中英

擦除Char []

[英]Erasing a Char[]

好吧,我正在研究別人的代碼。 他們做了很多這樣的事情:

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

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

視覺工作室也會報告內存泄漏,我幾乎把這個完成與使用的字符串聯系起來。

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

要將字符串初始化為0,您可以執行以下操作:

char description[256] = {0};

這將為數組的每個元素分配0。

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

正如其他人所說,在函數關閉之前,當它被放棄時,你不能“擦除”靜態創建的對象。 從技術上講,當函數被放棄時它也不會被刪除 - 堆棧指針只是被改變了。 如果你對被刪除的數據感到偏執,你應該遍歷數組,將每個條目設置為0'\\0' )。

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

你不必擔心上面發布的代碼中的內存泄漏,因為數組是在堆棧上分配的。 一旦它從堆棧中掉落(超出范圍),char數組就會被釋放。

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

如果你想要一個free() - 內存塊,你可以執行以下操作並在堆上分配數組:

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

*這不是一個實際的內存泄漏,但有些人說“內存泄漏”,當他們的意思是“內存不足”。 在任何情況下,堆棧空間比堆空間更受限制,因此您必須觀察在那里使用的內存塊的大小。

澄清到目前為止給出的好答案:

  • 是的,description [0] = 0從strxxx函數中清除字符串POW:strlen(description)== 0,strcmp(description,“”)== 0和std :: string(description)==“”都是真的。

  • 不,description [0] = 0與free(description)或memset(description,0,sizeof description)不同。 但你已經知道了。

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

\\0放在字符串的第一個元素中是一種清除字符串的安全方法,但這與刪除字符串不同,並且不會阻止內存泄漏。

如果它是一個char []字符串,並且對它執行的唯一操作是字符串函數,那很好。 當然,它對受保護的數據來說還不夠好。

至於內存泄漏,可能值得更改為字符串函數的安全版本,但是你不能泄漏靜態或基於堆棧的字符串,所以它可能是你的字符串被傳遞出去的地方。

為清楚起見,我將其更改為'\\ 0'。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM