sqlite3_bind_text用于c ++字符串的SQLITE_STATIC与SQLITE_TRANSIENT

时间:2013-04-16 17:51:00

标签: c++ sqlite

我有一个返回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是安全的选择,但是如果不需要它,我想避免复制/性能命中,因为这个查询将会运行很多。

1 个答案:

答案 0 :(得分:5)

在您的情况下,GetIpString()返回的字符串对象可能会在查询执行和最终确定之前被破坏,因此您应该SQLITE_TRANSIENT

一般情况下,您不应该为临时副本而烦恼,除非您测量的实际性能问题是由此引起的。