我用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;
这是输出:
答案 0 :(得分:2)
让我们举例说明这一行:
const char* deleteLog_query = DeleteLog(userIDstr).c_str();
假设DeleteLog
函数按值返回一个字符串对象,则返回的对象是一个临时对象,一旦表达式DeleteLog(userIDstr).c_str()
完成就会被破坏。这意味着返回的指针现在将指向不再存在的字符串,并且取消引用该指针将导致未定义的行为。
另一方面,如果DeleteLog
返回对字符串对象的引用,那么如果它是对非静态局部变量的引用,则会出现类似但同样糟糕的情况。当函数结束时,函数中的局部非静态变量超出范围,对这些变量的引用不再有效,使用它们也会导致未定义的行为。
那么问题的解决方案是什么?好吧,如果它是第二个问题(返回对非静态本地对象的引用),你需要让它按值返回字符串。这给了我们第一个问题,你可以通过保存指向临时对象的指针而不是使用正确的std::string
对象来解决这个问题,并在实际需要时使用c_str()
(例如在{{1}的实际调用中})。