[英]memory management
這是關於c ++代碼的內存管理問題。
using namespace std;
#include <iostream>
#include <string.h>
int main()
{
string a="first";
string *b= new string;
*b=a;
a="second";
cout << *b << ", " << a;
delete b;
return 0;
}
我們可以釋放存儲b指向的字符串的內存塊。 我假設這意味着一旦完成,b就不再有任何意義了。 我們可以解除分配b來釋放一些記憶。 為什么我們不能解除分配? 我知道我們只能刪除/釋放指針,但字符串a必須在某處占用一些內存。 有沒有什么方法可以釋放字符串a占用的內存? 如果有足夠的字符串初始化方式與初始化a相同,那么內存是否可能耗盡?
字符串a
在堆棧上聲明。 您無法手動釋放它,但一旦離開作用域(例如,當封閉函數返回時)它將自動釋放。 如果你需要能夠在函數中釋放該內存,那么請將其動態聲明(就像你為b
所做的那樣)。
該字符串由一個小對象組成,該對象包含指向字符串數據存儲的指針,其生命周期由對象管理。 通常不需要擔心對象本身占用的內存,但如果字符串很大,那么您可能想要在不破壞對象的情況下釋放存儲空間。
調用clear()
或從emptry字符串分配可能不會釋放存儲空間。 確保釋放它的方法是將字符串與新構造的臨時交換; 臨時的析構函數將釋放它。
string().swap(a); // replaces `a` with an empty string
您也可以對任何標准容器執行此操作。
這很尷尬。
<string.h>
是一個C頭。 它沒有定義string
。 看起來您的<iostream>
版本直接或間接包含<string>
,否則會出錯。
文字字符串(由配對引號分隔的那些字符串)幾乎可以在任何地方,包括只讀存儲器段。 (他們確實占用了記憶,但是你必須擁有大量的文本來產生重大影響:像War和Peace這樣的東西不會占用一個完整的meg。)在這種情況下,一個std::string
正在使用該值初始化,稍后會為其分配另一個值。 std::string
處理它使用的內存。
在C ++中,幾乎沒有理由擁有指向std::string
的指針。 沒有內容, std::string
不占用太多空間,它管理內容本身的內存。 你是否對char *
感到困惑?
你為b
new
了一個std::string
,然后你又為b
分配了另一個地址而沒有delete
內存。 那是內存泄漏。 你為b
new
內容仍然在那里分配,但沒有辦法delete
它,所以它會在程序的持續時間內占用內存。
然后,一旦你指定的地址a
到b
,你delete b;
。 這是一個壞主意,很可能會以一種可能不可預測的方式弄亂一些重要的東西。 僅delete
您使用new
獲取的內存。 (這里delete
的重要的不是b
是一個指針而應該被刪除,但是它指向的內存不是通過new
獲得的。)
內存管理就是這樣的。 字符串文字在某處分配。 所有你知道的是你不應該試圖改變它或以任何方式delete
它。 使用該值,不要觸摸其余部分。 std::string
管理內存以獲取其自己的內容,並將在其析構函數中處理它。 在函數或其他塊中聲明的變量將在超出范圍時被銷毀(盡管它可能指向的任何內容不會被自動銷毀;只有當它是智能指針或管理自己的內存或其他任何內容時)。 如果是new
內存,請不要丟棄指針值,直到delete
它為止。 如果您沒有new
內存,請不要delete
它。
自動對象(如你的a)在超出范圍時會被銷毀。 見下面的例子:
int main()
{
{
string a="first";
string *b= new string;
*b=a;
a="second";
cout << *b << ", " << a;
delete b; //b gets freed
} //a gets freed because it has gone out of scope
/* You can write more code here that does not need a */
return 0;
}
分配的內存將在函數返回后自動釋放。
a
在“堆棧”上自動分配,並在超出范圍時自動銷毀/解除分配。
當您使用new
/ malloc
動態內存時,它會被分配到“堆”,這只是程序可用的一堆內存。 你必須手動管理它,程序不知道何時擺脫它。
如果你真的擔心這種情況下的內存,你應該只使用動態內存分配。
編輯:這提供了比我想說的更完整的解釋: http : //en.wikipedia.org/wiki/Malloc#Rationale
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.