C 陷阱之慎用string類

2022-02-07 16:32:45 字數 1083 閱讀 2000

我們知道,string類為我們提供了很多的便利,我們用string類能方便的做字串的各種操作,避免了我們直接操作char指標而產生的一些繁瑣的操作,和記憶體洩露的可能性,可是string類也是有陷阱的。下面我們看這樣乙個例子,你能看出問題所在嗎?

string

getstring()

void

test()

如果看不出來可以實際執行一下,會發現輸不出結果來,這是為什麼呢?

當我們寫getstring函式時,如果其返回型別是const char*我們可能會分外小心,因為我們知道"just a test"生命會在函式返回後結束,我們可能會new一段空間來放這個字串,然後返回指標,或者是要求呼叫者給乙個空間來放這個字串。但是當返回型別是string時,我們就不會如此小心翼翼,因為我們知道string類實現了拷貝建構函式和賦值函式。它會為我們操心空間分配和銷毀的問題。所以在這裡,我們直接返回"just a test"字串是沒有問題的。

接著我們對乙個string物件呼叫c_str函式貌似也沒有什麼問題,因為這是string類提供給我們的功能。但是這裡的關鍵是,我們沒有將getstring()的結果賦給乙個string物件就直接獲取其指標了,這時,系統並不會為string呼叫拷貝建構函式或是賦值函式,返回的string仍然只是乙個臨時物件的狀態,它會在完成對pc的賦值後被銷毀,這時其內部的資料也不會存在了。

怎麼解決這個問題呢?

我們要改變c_str函式,讓它不要直接返回指標,而是new一段空間來放這個字串再返回指標嗎?這樣,會降低效率,且每個呼叫c_str函式的使用者都需要操心delete指標的問題,很容易造成記憶體洩露。

我們要改寫getstring函式,重新為返回的字串new一段空間嗎?這麼做顯然也不合適。

這時,我們有兩種比較可行的解決方法。

1.不要直接返回臨時物件的指標,將臨時物件先賦值給乙個區域性物件,再獲取其指標。這樣,將上例改寫為

void

test()

2.如果要使用臨時物件的指標,將所有的使用放到乙個語句裡進行。這樣,將上例改寫為

void

test()

C 學習之string類

string類 string初始化 示例 include includeusing namespace std int main string s1 hello world 把字串賦給當前字串s1 cout string字元操作 示例 include includeusing namespace s...

C 之string類速查

基本宣告方法 string str string類的建構函式和析構函式如下 a string s 生成乙個空字串s b string s str 拷貝建構函式 生成str的複製品 c string s str,stridx 將字串str內 始於位置stridx 的部分當作字串的初值 d string...

C 之string類初識

string類 標頭檔案包含 include 1 string std提供的標準字串處理的類 class string 成員變數,方法 特點 可變長 動態分配,不再關注字串的長度 2 屬性 1 size string的大小,不包含 0 2 length string的長度,不包含 0 3 empty...