2016-05-13 90 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

相关问题