c++ - while 循环中的 MySQL Connector/C++ 错误

标签 c++ mysql mysql-connector

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();
        }
    }
}

所以上面的函数在无限循环的每次迭代中被调用一次,并且函数总是在第二次迭代时失败。我认为这在某种程度上与第一次迭代时删除 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();
}

最佳答案

好的,伙计们,我已经解决了这个问题,作为新手,我学到了非常重要的一课。问题的发生是由于我粗心大意导致的未定义行为,以确保我“删除了所有动态分配的变量”一旦我在正确的位置添加了删除,一切都完美无缺。所以任何遇到这类随机问题的人一定要检查这些:)

关于c++ - while 循环中的 MySQL Connector/C++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41420962/

相关文章:

C++ Mysql 在数据库中保存二进制 blob

C++ - TC++PL RTTI dynamic_cast 向下转型和虚拟表混淆(及其实现)

c++ - 使用 decltype(auto) 的基于范围的 for 循环

PHP 和 MySQL 数据库查询问题

java - Hibernate HQL 嵌套查询

python - 使用 Python 进行 MySQL 查询不返回所有结果

c++ - 为什么 C++ 不允许在非模板函数中使用可变参数?

c++ - 为什么将除法改为右移时会发生有符号溢出?

java - 将 resultSet 从 servlet 传递到 JSP 文件。 ArrayList 类型的属性始终为 null

python - 莫名其妙的python mysql连接问题