天天看點

C++ string中的幾個小陷阱,你掉進過嗎?1.  結構體中的string指派問題2. c_str()函數問題

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()傳回的指針引用。

3. 字元串字面值與标準庫string不是同一種類型

直接看下面的例子:

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