【问题标题】:Mysql++ Query fails only when the query variable is a pointer... :S只有当查询变量是指针时,Mysql++ 查询才会失败...:S
【发布时间】:2012-10-13 18:01:16
【问题描述】:

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

【问题讨论】:

    标签: pointers mysql++


    【解决方案1】:

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

    这意味着,一旦您进行execute 呼叫,您的查询不一定是有效的活动对象。

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

    【讨论】:

    • 谢谢!将“query = &conn.query()”行更改为“query = new mysqlpp::Query(&conn, true)”使其工作。但我不能说我理解为什么,看到这与 conn->query() 函数的作用基本相同......我使用 Visual Studio 10 附带的编译器,它没有给我任何警告。
    • @user1236689:不,两者“基本相同”。您的第二个块试图获取由Connection::query() 的值返回的临时对象的地址,并且该对象在该行和下一行之间消失。如果这可行,那纯粹是因为堆栈空间尚未被重用,并且 OS+CPU 组合不会检查对已释放堆栈空间的访问。您在评论中的成功选择是在堆上创建新对象,而不是完全一样的东西。上面的第一个块有效,因为您在使用之前将临时值复制到命名的局部变量中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多