2016-05-13 2 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 возвращает объект строки по значению, то возвращается object - это временный объект, который будет разрушен после завершения выражения DeleteLog(userIDstr).c_str(). Это означает, что возвращаемый указатель теперь укажет на строку, которая больше не существует, и разыменование этого указателя приведет к неопределенным поведением.

Если, с другой стороны, DeleteLog возвращает ссылку на строковый объект, то если это ссылка на нестатистическую локальную переменную, у вас есть аналогичный, но одинаково плохой сценарий. Локальные нестатические переменные в функции исчезают из области действия, когда функция заканчивается, а ссылки на такие переменные больше не действительны, и использование их также приведет к неопределенным поведением.

Так каково решение вашей проблемы? Хорошо, если это вторая проблема (возвращающая ссылки на нестатические локальные объекты), вам нужно заставить ее вернуть строку по значению. Это дает нам первую проблему, которая решается вами, не сохраняя указатели на временный объект и вместо этого используя подходящие объекты std::string, и используйте c_str(), когда это действительно необходимо (например, при фактическом вызове mysql_query).

+0

Я понял, большое спасибо – JingYi

Смежные вопросы