我遇到了一个问题,这让我觉得我不理解一些基本的东西。我正在使用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;
}
答案 0 :(得分:2)
在后一版本中,您将地址存储到临时对象(临时存储在堆栈中的函数的返回值)中,该对象立即被破坏。
这意味着,一旦您进入execute
来电,您的查询就不一定是有效的有效对象。
不确定您正在使用哪种编译器,但g ++通常会对此类代码发出warning: taking address of temporary
警告。