2013-08-19 32 views
1

我知道動態內存比設置一個固定大小的數組和使用它的一部分具有優勢。但是在動態內存中,您必須輸入要存儲在數組中的數據量。使用字符串時,可以根據需要鍵入儘可能多的字母(甚至可以使用字符串來輸入數字,然後使用函數將其轉換)。這個事實讓我覺得與字符串相比,字符數組的動態內存已經過時了。字符串如何在C++中分配內存?

所以我想知道什麼是使用字符串的優點和缺點?字符串佔用的空間何時被釋放?也許選擇釋放你的動態分配的內存與刪除字符串的優勢?請解釋。

+0

字符串不是魔術。他們只是一個圖書館功能。 –

+0

@KerrekSB:但它比使用自己的動態內存'char *'代碼更好! –

+0

@MatsPetersson:是的,當然,但是「動態分配內存vs字符串」的OP表達式是錯誤的二分法。字符串*是*(通常)動態容器。 –

回答

3

std :: string通常包含一個內部動態分配的緩衝區。在分配數據時,或者如果推回新數據,並且當前緩衝區大小不足,則會爲大小增加的新緩衝區分配一個新的緩衝區,並將舊數據複製或移動到新緩衝區。舊的緩衝區然後被釋放。

當字符串超出範圍時,主緩衝區將被釋放。如果字符串對象是函數中的一個局部變量(在堆棧上),它將在當前代碼塊的末尾釋放。如果它是一個函數參數,則該函數退出。如果它是一個班級成員,那麼每當班級被毀壞時。

字符串的優點是靈活性(自動增加大小)和安全性(難以超越數組邊界)。由於不需要動態分配,因此堆棧中的固定大小的char數組速度更快。但是如果你有性能問題,而不是之前你應該擔心。

6

在字符數組上使用std::string的簡短回答是「不,沒有缺點,只有優點」。

當然,字符串會使用動態內存,它隱藏了幕後的事實,所以您不必擔心它。

在回答你的問題時:字符串佔用的空間何時被釋放? this可能是有幫助的。基本上,std::string s一旦超出範圍就會被釋放。通常編譯器可以決定何時分配和釋放內存。

1

好吧,你的問題讓我思考,然後我明白你在談論語法差異,因爲這兩種方式都是動態分配char數組。唯一的區別是需要:

  • ,如果你需要創建一個包含一個句子,然後您可以將字符串, 這很好,不要使用malloc
  • 如果你想要一個數組和「玩」與它意味着更改或設置單元格按某種方法,或更改它的大小,然後啓動它與malloc將是適當的方式
  • 我看到一個靜態分配char a[17](例如)的唯一原因是爲單你需要的專用字符串,只有當你知道你需要的確切尺寸時,這意味着它不會改變

,一個很重要的一點找到了我:

在動態分配內存,如果內存被不斷分配,但分配給該未使用的對象之一,沒有被釋放,那麼它可能會導致堆棧溢出情況或內存泄漏這是一個很大的缺點。

+2

咦?我不知道你在說什麼,更重要的是,在這個特定的上下文中提到堆棧溢出的目的是什麼。 –

+0

@MatsPetersson但是!但! Stackoverflow真棒! – sehe