簡體   English   中英

將字符設置為 '\\0' 會泄漏內存嗎?

[英]Would setting a char to '\0' leak memory?

char myStr[] = "Hello World";
char *p = strchr(myStr, 'W');
*p = '\0';
// Now myStr would be "Hello ";

如果我做這樣的事情,這會泄漏“orld”部分的內存嗎?

不,因為在 C 中,字符串只是以'\\0'字符結尾的預定義char數組。 字符串的所有空間都是在運行時預先分配的,並且是不靈活的,除非您重新分配變量以指向不同的內存部分,這超出了本問題的范圍。

在您的示例中,您將一個char數組初始化為“Hello World”,它是 12 個字節,計算末尾的 \\0 字符。 在程序完成之前,這 12 個字節是您的,不會以常規方式丟失。 重置字符串的內容就像將不同的值寫入char數組一樣簡單。 只要您的數據不超過數組的限制,您就不會遇到任何問題或內存泄漏。

希望這可以幫助。

將字符設置為 '\\0' 會泄漏內存嗎?

一般來說,沒有。

當您失去對資源的句柄時,就會發生資源泄漏。 例如,當您使用malloc分配內存時,您會得到一個指針,該指針必須傳遞給free才能釋放內存。 如果丟失了指針值,則永遠無法釋放內存。 那就是內存泄漏。

在示例程序中,您有一個自動存儲的數組,其中包含元素 ['H','e','l','l','o',' ','\\0','o', 'r','l','d','\\0'。 當它超出范圍時,它會被銷毀並自動釋放其內存。

考慮:

char myStr[] = "Hello World";
char *p = strchr(myStr, 'W');
*p = '\0';

printf( "Length of myStr = %d\n", strlen( myStr ) ) ;
printf( "Size of myStr = %d\n", sizeof( myStr ) ) ;

輸出將是:

Length of myStr = 0
Size of myStr = 12

數組的大小和字符串的長度不是一回事。 C 中的字符串不是數據類型,它只是以 NUL 結尾的相鄰字符。 C 中的字符串包含在連續內存的數組或塊中,該數組或塊必須至少與字符串加 1 一樣長(以容納 NUL)。

沒有內存泄漏甚至“丟失”,因為您可以隨時訪問myStr數組的全部 12 個字節。

無論如何,當您未能將動態分配的內存塊返回到堆時,就會發生內存泄漏。 由於myStr不是動態分配的,因此它不會“泄漏”。 即使是這樣,修改其內容也不會導致泄漏 - 盡管過度/不足運行分配可能會破壞堆。

當您不再擁有對未自動釋放的已分配內存的引用時,就會發生內存泄漏。

為數組元素賦值不會導致內存泄漏,因為這不會丟失對數組的引用。

在您的情況下,如果數組具有功能范圍,則該數組具有自動存儲持續時間,因此當它超出范圍時,它會自動取消分配。

但是即使您有一個動態分配的數組,分配也不會丟失分配的內存地址,因此不會泄漏。

暫無
暫無

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

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