九九热这里直有精品,1区二区三区在线播放,玖玖爱在线观看资源,国产aⅴ综合网,午夜福利男女,日本亚洲欧美三级,日韩无码黄色导航,内射少妇13区,中文字幕高清网

您身邊的軟件定制專家--9年開發(fā)經(jīng)驗為您護(hù)航

18678812288
0531-88887250

C++陷阱之慎用string類

文章作者:濟(jì)南軟件開發(fā) 時間:2016年12月20日

我們知道,string類為我們提供了很多的便利,我們用string類能方便的做字符串的各種操作,避免了我們直接操作char指針而產(chǎn)生的一些繁瑣的操作,和內(nèi)存泄露的可能性,可是string類也是有陷阱的。下面我們看這樣一個例子,你能看出問題所在嗎?

 

復(fù)制代碼

string getString()

{

    return "just a test";

}

void test()

{

    const char *pc = getString().c_str();

    cout<<pc<<endl;

}

復(fù)制代碼

 

如果看不出來可以實際運行一下,會發(fā)現(xiàn)輸不出結(jié)果來,這是為什么呢?

 

當(dāng)我們寫getString函數(shù)時,如果其返回類型是const char*我們可能會分外小心,因為我們知道"just a test"生命會在函數(shù)返回后結(jié)束,我們可能會new一段空間來放這個字符串,然后返回指針,或者是要求調(diào)用者給一個空間來放這個字符串。但是當(dāng)返回類型是string時,我們就不會如此小心翼翼,因為我們知道string類實現(xiàn)了拷貝構(gòu)造函數(shù)和賦值函數(shù)。它會為我們操心空間分配和銷毀的問題。所以在這里,我們直接返回"just a test"字符串是沒有問題的。

 

接著我們對一個string對象調(diào)用c_str函數(shù)貌似也沒有什么問題,因為這是string類提供給我們的功能。但是這里的關(guān)鍵是,我們沒有將getString()的結(jié)果賦給一個string對象就直接獲取其指針了,這時,系統(tǒng)并不會為string調(diào)用拷貝構(gòu)造函數(shù)或是賦值函數(shù),返回的string仍然只是一個臨時對象的狀態(tài),它會在完成對pc的賦值后被銷毀,這時其內(nèi)部的數(shù)據(jù)也不會存在了。

 

怎么解決這個問題呢?

 

我們要改變c_str函數(shù),讓它不要直接返回指針,而是new一段空間來放這個字符串再返回指針嗎?這樣,會降低效率,且每個調(diào)用c_str函數(shù)的用戶都需要操心delete指針的問題,很容易造成內(nèi)存泄露。

 

我們要改寫getString函數(shù),重新為返回的字符串new一段空間嗎?這么做顯然也不合適。

 

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

 

1.不要直接返回臨時對象的指針,將臨時對象先賦值給一個局部對象,再獲取其指針。這樣,將上例改寫為

 

void test()

{

    string str = getString();

    const char *pc = str.c_str();

    cout<<pc<<endl;

}

 

 

2.如果要使用臨時對象的指針,將所有的使用放到一個語句里進(jìn)行。這樣,將上例改寫為

 

void test()

{

    cout<<getString().c_str()<<endl;

}


想要了解更多詳情歡迎來電咨詢18678812288
登陸網(wǎng)址:m.h6244.cn。
聯(lián)系人:王經(jīng)理。

乐陵市| 台州市| 皋兰县| 湖南省| 留坝县| 新宁县| 化州市| 禹州市| 河北区| 洮南市| 仲巴县| 泗洪县| 铁力市| 山丹县| 黄骅市| 衢州市| 乌兰浩特市| 萨迦县| 富宁县| 阜平县| 青河县| 内黄县| 温泉县| 奎屯市| 敖汉旗| 桂东县| 宝鸡市| 阿克陶县| 思茅市| 蒙阴县| 瑞昌市| 南陵县| 闽侯县| 民权县| 瑞安市| 开阳县| 惠州市| 宣化县| 米易县| 河北省| 宁明县|