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 に答える