void dataProcess::loginProcess(byte* packet, uint16_t length)
{
unique_ptr<ResultSet> res;
unique_ptr<Statement> stmt;
byte idPacket[4] = {packet[9], packet[8], packet[7], packet[6]};
uint32_t id, account_id;
string account_pass, account_type;
id = decodeToInt(idPacket, 4);
account_pass = decodeToChar(packet, 14, length - 1);
account_type = decodeToChar(packet, 10, 11);
stmt.reset(this->con->createStatement());
res.reset(stmt->executeQuery("SELECT * FROM account_info"));
while(res->next())
{
account_id = res->getUInt("id");
if(lowerCase(account_type).compare("ts") == 0)
{
if((account_id == id) && (account_pass.compare(res->getString("password")) == 0))
{
sendPacket("F4440300010300");
}
else
{
wrongPass();
}
}
else
{
wrongPass();
}
}
}
so wird die obige Funktion einmal in jeder Iteration einer unendlichen While-Schleife aufgerufen und die Funktion immer bei der 2. Iteration fehlgeschlagen. Ich denke, das hängt irgendwie mit dem Löschen des ResultSet-Objekts bei der ersten Iteration zusammen, weil, wenn ich versuche, einen normalen Zeiger zu verwenden und die delete-Anweisung das gleiche Problem auftritt, aber wenn ich das Löschen entferne, kann es durch die zweite Iteration kommen. Ich bin mir ziemlich sicher, dass das ResultSet gemäß dem Beispiel auf der MySQL-Website gelöscht werden muss. Ich bin ziemlich neu in MySQL Connector/C++, so dass ich sehr unsicher bin, was dieses Problem verursacht. Beim Debugging scheint es bei dieser Zeile in der zweiten Iteration nicht zu funktionieren.MySQL Connector/C++ - Fehler in der Schleife
res.reset(stmt->executeQuery("SELECT * FROM account_info"));
Dies ist der Fehler, der das Programm erscheint nach der zweiten Iteration
Error in `./server': free(): invalid size: 0x00007f8214004ca0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x790cb)[0x7f8219aa70cb]
/lib/x86_64-linux-gnu/libc.so.6(+0x8275a)[0x7f8219ab075a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f8219ab418c]
/usr/lib/x86_64-linux-gnu/libmysqlcppconn.so.7(_ZN5boost20checked_array_deleteIc EEvPT_+0x1f)[0x7f821a9397df]
/usr/lib/x86_64-linux-gnu/libmysqlcppconn.so.7(_ZN5boost12scoped_arrayIcED1Ev+0x 1b)[0x7f821a9390b5]
/usr/lib/x86_64-linux-gnu/libmysqlcppconn.so.7(_ZN3sql5mysql15MySQL_ResultSetC2E N5boost10shared_ptrINS0_9NativeAPI22NativeResultsetWrapperEEENS2_8weak_ptrINS4_2 3NativeConnectionWrapperEEENS_9ResultSet9enum_typeEPNS0_15MySQL_StatementERNS3_I NS0_17MySQL_DebugLoggerEEE+0x205)[0x7f821a98cde3]
/usr/lib/x86_64-linux-gnu/libmysqlcppconn.so.7(_ZN3sql5mysql15MySQL_Statement12e xecuteQueryERKNS_9SQLStringE+0x11b)[0x7f821a99443f]
./server(+0x326e)[0x56192448126e]
./server(+0x2f40)[0x561924480f40]
./server(+0x2da3)[0x561924480da3]
./server(+0x2a45)[0x561924480a45]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ca)[0x7f8219dfc6ca]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x5f)[0x7f8219b360af]
Klasse und den Konstruktor betritt:
class dataProcess : public thread
{
public:
dataProcess(int sock);
virtual ~dataProcess();
protected:
virtual void thread_handler();
private:
void wrongPass();
void loginProcess(byte* packet, uint16_t length);
void sendPacket(string packet);
int sock;
player* p;
Driver* driver;
unique_ptr<Connection> con;
};
dataProcess::dataProcess(int sock)
{
this->sock = sock;
driver = get_driver_instance();
con.reset(driver->connect("localhost", "root", "password"));
con->setSchema("ts_server");
thread::startThread();
}
ist die 'res' in der Funktion wie bekannt erklärt? oder ist es tatsächlich in der Klasse, zu der diese Funktion gehört? Ich frage nur, weil du nur einen ungültigen freien bekommen würdest, wenn "res" auf etwas gelöscht zeigt (nicht möglich in deinem Post). sonst müsste es in 'executeQuery()' – vu1p3n0x
sein bitte zeigen Sie den Code, wo Sie diese Funktion – vu1p3n0x
Schleife so einfach die Schleife ist nur eine Weile (1) mit der Funktion darin. 'res' ist in der Funktion deklariert, weshalb ich sehr verwirrt bin, wie es bei der zweiten Iteration gescheitert ist. Beachten Sie auch, dass die 'Driver' und 'Connection con' in der Klasse deklariert sind. –