0

我遇到了一个问题,这让我认为我不了解一些基本的东西。我正在使用 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;
    }
}

虽然以下产生输出“查询为空”并且未在数据库中创建表。

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;
}
4

1 回答 1

2

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

这意味着一旦您execute接听电话,您的查询不一定是有效的活动对象。

不确定您使用的是什么编译器,但 g++ 通常会warning: taking address of temporary针对此类代码发出警告。

于 2012-10-13T18:20:50.997 回答