只有当查询变量是一个指针......时,Mysql ++ Query才会失败

时间:2012-10-13 18:01:17

标签: pointers mysql++

我遇到了一个问题,这让我觉得我不理解一些基本的东西。我正在使用MySQL ++并且当调用query.execute()(其中“query”是类mysqlpp :: Query的实例)时它可以工作,但是在调用query-> execute()时(其中“query”是指向一个类myqslpp :: Query的实例)相同的查询失败!错误消息是“查询为空”。

以下是我用来测试它的代码。

以下运行没有错误,表在数据库中创建。

void test1() {
    mysqlpp::Connection conn;
    conn.connect(0, "server", "user", "password");
    conn.select_db("db_name");

    mysqlpp::Query query = conn.query();
    try {
        query << "CREATE TABLE IF NOT EXISTS MY_TABLE (MY_COLUMN SMALLINT)";
        query.execute();
    }
    catch (const mysqlpp::BadQuery&) {
        std::cerr << query.error() << std::endl;
    }
}

虽然以下产生输出“Query is empty”,但未在数据库中创建表。

void test2() {
    mysqlpp::Connection conn;
    mysqlpp::Query *query = 0;
    conn.connect(0, "server", "user", "password");
    conn.select_db("db_name");

    query = &conn.query();
    try {
        *query << "CREATE TABLE IF NOT EXISTS MY_TABLE (MY_COLUMN SMALLINT)";
        query->execute();
    }
    catch (const mysqlpp::BadQuery&) {
        std::cerr << query->error() << std::endl;
    }
    query = 0;
}

1 个答案:

答案 0 :(得分:2)

在后一版本中,您将地址存储到临时对象(临时存储在堆栈中的函数的返回值)中,该对象立即被破坏。

这意味着,一旦您进入execute来电,您的查询就不一定是有效的有效对象。

不确定您正在使用哪种编译器,但g ++通常会对此类代码发出warning: taking address of temporary警告。