我有一个返回c ++ std :: string的方法,然后在将它传递给sqlite3_bind_text之前将其转换为c_str()。我的问题是,这应该使用SQLITE_STATIC还是SQLITE_TRANSIENT?
sqlite3_bind_text(insertStatement, 0, suspect->GetIpString().c_str(), -1, SQLITE_STATIC);
// Do some stuff in same function then sqlite3_step
sqlite3_bind_text的文档说明,
sqlite3_bind_blob(),sqlite3_bind_text()的第五个参数,以及 sqlite3_bind_text16()是一个析构函数,用于处理BLOB或 SQLite完成后的字符串。析构函数被调用 即使调用sqlite3_bind_blob(),也处理BLOB或字符串, sqlite3_bind_text()或sqlite3_bind_text16()失败。如果是第五个 参数是特殊值SQLITE_STATIC,然后SQLite假设 信息在静态,非托管空间中,不需要 释放。如果第五个参数的值为SQLITE_TRANSIENT,那么 SQLite在之前立即制作了自己的数据私有副本 sqlite3_bind _ *()例程返回。
GetIpString返回一个std :: string,但如果我没有明确地复制它,那么该字符串会在调用后继续存在吗?另外,在没有SQLITE_TRANSIANT的情况下使用.c_str()是否安全?我知道SQLITE_TRANSIENT是安全的选择,但是如果不需要它,我想避免复制/性能命中,因为这个查询将会运行很多。
答案 0 :(得分:5)
在您的情况下,GetIpString()
返回的字符串对象可能会在查询执行和最终确定之前被破坏,因此您应该SQLITE_TRANSIENT
。
一般情况下,您不应该为临时副本而烦恼,除非您测量的实际性能问题是由此引起的。