簡體   English   中英

內存管理

[英]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它,所以它會在程序的持續時間內占用內存。

然后,一旦你指定的地址ab ,你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.

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