[英]MySQL Connector/C++ error in while loop
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();
}
}
}
因此,上述函數在無限while循環的每次迭代中都會被調用一次,並且該函數總是在第二次迭代時失敗。 我認為這與第一次迭代時刪除ResultSet對象有關,因為當我嘗試使用普通指針並使用delete語句時,也會發生相同的問題,但是如果刪除刪除,它可以通過第二次迭代,但是我我非常確定,根據MySQL網站上的示例,需要刪除ResultSet。 我是mysql Connector / C ++的新手,所以我不確定導致此問題的原因。 從調試來看,它似乎在第二次迭代的這一行失敗。
res.reset(stmt->executeQuery("SELECT * FROM account_info"));
這是程序進入第二次迭代后出現的錯誤
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]
類和構造函數:
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();
}
好的,我已經解決了這個問題,並且作為一個新手,我學到了非常重要的一課。 發生問題是由於我的粗心大意導致的不確定行為,以確保我已經“刪除了所有動態分配的變量”。在正確的位置添加了delete后,一切運行正常。 因此,面對此類隨機問題的任何人請務必進行檢查:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.