2016-05-13 17 views
-1

Ich benutze C++, um mysql zu verbinden, um einige Operationen abzuschließen, das ist Teile meines Codes.Ich möchte wissen, warum die beiden Ausgänge unterschiedlich sind

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; 

diese ausgegeben:

enter image description here

+1

Dies ist nicht C .. –

Antwort

2

Lets beispielsweise diese Zeile erfolgen:

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

Nehmen wir an, dass die DeleteLog Funktion ein String-Objekt durch einen Wert zurückgibt, dann wird die zurück Objekt ist ein temporäres Objekt, das zerstört wird, sobald der Ausdruck DeleteLog(userIDstr).c_str() beendet ist. Das bedeutet, dass der Zeiger, der zurückgegeben wird, jetzt auf eine Zeichenfolge zeigt, die nicht mehr vorhanden ist, und das Dereferenzieren dieses Zeigers wird zu undefined Verhalten führen.

Wenn andererseits DeleteLog einen Verweis auf ein Zeichenfolgenobjekt zurückgibt, haben Sie ein ähnliches, aber ebenso schlechtes Szenario, wenn es sich um eine Referenz auf eine nicht statische lokale Variable handelt. Lokale nicht statische Variablen in einer Funktion gehen bei Beendigung der Funktion nicht in den Geltungsbereich, und Verweise auf solche Variablen sind nicht mehr gültig, und ihre Verwendung führt auch zu undefiniertem Verhalten.

Was ist die Lösung für Ihr Problem? Nun, wenn es das zweite Problem ist (Rückgabe von Verweisen auf nicht statische lokale Objekte), müssen Sie die Zeichenfolge als Wert zurückgeben. Das gibt uns das erste Problem, das dadurch gelöst wird, dass Sie Zeiger nicht auf temporäres Objekt speichern und stattdessen richtige std::string Objekte verwenden und c_str() verwenden, wenn sie tatsächlich benötigt werden (z. B. in dem tatsächlichen Aufruf von mysql_query).

+0

Ich habe verstanden, vielen Dank – JingYi

Verwandte Themen