天天看點

C++ string中的幾個小陷阱,你掉進過嗎?1.  結構體中的string指派問題2. c_str()函數問題3. 字元串字面值與标準庫string不是同一種類型

C++開發的項目難免會用到STL的string,使用管理都比char數組(指針)友善的多,但在得心應手的使用過程中也要警惕幾個小陷阱,避免我們項目出bug卻遲遲找不到原因。

直接通過一個例子說明,下面的例子會輸出什麼:

嗯,當然不是簡單的輸出“hello”了,在Linux下用g++編譯後運作試試,會出現“Segmentation fault (core

dumped)”,why?問題就出在給fr指針配置設定記憶體的時候,注意這裡用的是C中的malloc而不是new,如果你換成new再運作,就不會報錯

了,成功的輸出“hello”,那為什麼malloc就不行呢?這就要看malloc()與new()的差別了,關于兩者的差別是程式員面試中屢問不爽的經典面試題,是以相信一般的程式員都知道它們之間有一個非常重要的差別就是:new在配置設定記憶體時會調用預設的構造函數,而malloc不會調用。

而STL的string在指派之前需要調用預設的構造函數以初始化string後才能使用,如指派、列印等操作,如果使用malloc配置設定記憶體,就不會調

用string預設的構造函數來初始化結構體中的app_name字元串,是以這裡給其直接指派是錯誤的,應該使用new操作符。這也提示我們用C++開發程式時,就盡量使用C++中的函數,不要C++與C混合程式設計,導緻使用混淆,比如有時候new配置設定的記憶體卻用free釋放。

c_str()函數用于string與const char*之間的轉換,也經常能用到,下面的例子你說輸出啥?

嗯,第一個不用多說,第二個輸出是“Alexia”還是“Amexia”呢?答案是後者,咋一看const char*的值應該是個常量啊,怎麼還能改變值呢?哈,又是個經典的面試題:const char*, char const*, char*

const的差別是什麼?老生常談的問題,const char*與char

const*是等價的,指的是指向字元常量的指針,即指針不能變但其指向的内容可以改變,而char*

const相反,指的是常量指針,即指向可以改變但指針指向的内容不可改變。是以這裡的const

char*指向的内容是可以改變的,那麼為什麼改變了呢?這跟str這個const char*的生命周期及string類的實作有關,string的c_str()傳回的指針是由string管理的,是以它的生命期是string對象的生命期,而string類的實作實際上封裝着一個char*的指針,而c_str()直接傳回該指針的引用,是以string對象的改變會直接影響已經執行過的c_str()傳回的指針引用。

直接看下面的例子:

可以看出兩者是非常不同的,不能混淆使用。