| 網(wǎng)站首頁 | 關(guān)于我們 | 開發(fā)優(yōu)勢 | 產(chǎn)品展示 |
| 合作企業(yè) | 新聞動態(tài) | 聯(lián)系我們 | 電話聯(lián)系 |
文章作者:濟(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)理。