2016-05-13 73 views
-1

我用C++連接mysql來完成一些操作,這是我的代碼的一部分。我想知道爲什麼兩個輸出不同

const char* deleteLog_query = DeleteLog(userIDstr).c_str(); 
cout<<deleteLog_query<<endl; 
const char* deleteReplyOfLog_query = DeleteReplyOfLog(userIDstr).c_str(); 
mysql_query(&mysql_conn,deleteReplyOfLog_query); 
mysql_result = mysql_store_result(&mysql_conn); 
const char* deleteShareOfLog_query = DeleteShareOfLog(userIDstr).c_str(); 
mysql_query(&mysql_conn,deleteShareOfLog_query); 
mysql_result = mysql_store_result(&mysql_conn); 

cout<<deleteLog_query<<endl; 
mysql_query(&mysql_conn,deleteLog_query); 
mysql_result = mysql_store_result(&mysql_conn); 
if(mysql_result!=0) cout<<"\t right delete!"<<endl; 

這是輸出:

enter image description here

+1

這不是C .. –

回答

2

讓我們例如這一行:

const char* deleteLog_query = DeleteLog(userIDstr).c_str(); 

比方說,該DeleteLog函數由值返回字符串對象,則返回對象是一旦表達式DeleteLog(userIDstr).c_str()完成就會被銷燬的臨時對象。這意味着返回的指針現在將指向一個不再存在的字符串,並且取消引用該指針將導致未定義的行爲

另一方面,如果DeleteLog返回對字符串對象的引用,那麼如果它是對非靜態局部變量的引用,那麼您有類似但同樣不好的場景。當函數結束時,函數中的局部非靜態變量超出範圍,並且對這些變量的引用不再有效,並且使用它們也會導致未定義的行爲

那麼你的問題的解決方案是什麼?那麼如果這是第二個問題(返回對非靜態本地對象的引用),則需要使其按值返回字符串。這給了我們第一個問題,這是通過不保存指向臨時對象的指針來解決的,而是使用正確的std::string對象,並在實際需要時使用c_str()(例如在實際調用mysql_query時)。

+0

我明白了,非常感謝你 – JingYi

相關問題