我想知道为什么两个输出是不同的

时间:2016-05-13 06:29:02

标签: c++ mysql c

我用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 个答案:

答案 0 :(得分:2)

让我们举例说明这一行:

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

假设DeleteLog函数按值返回一个字符串对象,则返回的对象是一个临时对象,一旦表达式DeleteLog(userIDstr).c_str()完成就会被破坏。这意味着返回的指针现在将指向不再存在的字符串,并且取消引用该指针将导致未定义的行为

另一方面,如果DeleteLog返回对字符串对象的引用,那么如果它是对非静态局部变量的引用,则会出现类似但同样糟糕的情况。当函数结束时,函数中的局部非静态变量超出范围,对这些变量的引用不再有效,使用它们也会导致未定义的行为

那么问题的解决方案是什么?好吧,如果它是第二个问题(返回对非静态本地对象的引用),你需要让它按值返回字符串。这给了我们第一个问题,你可以通过保存指向临时对象的指针而不是使用正确的std::string对象来解决这个问题,并在实际需要时使用c_str()(例如在{{1}的实际调用中})。