2017-01-02 2 views
2
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(); 
} 
+1

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

+0

sein bitte zeigen Sie den Code, wo Sie diese Funktion – vu1p3n0x

+0

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. –

Antwort

0

Ok Jungs, die ich gelöst haben dieses Problem, und ich habe gelernt, eine sehr wichtige Lektion als Neuling. Das Problem tritt aufgrund des undefinierten Verhaltens auf, das durch meine Sorglosigkeit verursacht wurde, um sicherzustellen, dass ich alle meine dynamisch zugewiesenen Variablen gelöscht habe. Sobald ich das Löschen an der richtigen Stelle hinzugefügt habe, funktioniert alles perfekt. also jemand, der diese Art von zufälligen Problemen konfrontiert, stellen Sie sicher, diese zu überprüfen :)