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

Phe*_*ide 5 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
Run Code Online (Sandbox Code Playgroud)

sqlite3_bind_text的文档说,

sqlite3_bind_blob(),sqlite3_bind_text()和sqlite3_bind_text16()的第五个参数是一个析构函数,用于在SQLite完成后处理BLOB或字符串.即使对sqlite3_bind_blob(),sqlite3_bind_text()或sqlite3_bind_text16()的调用失败,也会调用析构函数来处置BLOB或字符串.如果第五个参数是特殊值SQLITE_STATIC,那么SQLite假定信息在静态的非托管空间中,并且不需要被释放.如果第五个参数的值为SQLITE_TRANSIENT,那么在sqlite3_bind _*()例程返回之前,SQLite会立即自己创建数据的私有副本.

GetIpString返回一个std :: string,但如果我没有明确地复制它,那么该字符串会在调用后继续存在吗?另外,在没有SQLITE_TRANSIANT的情况下使用.c_str()是否安全?我知道SQLITE_TRANSIENT是安全的选择,但如果不需要,我想避免复制/性能命中,因为这个查询将会运行很多.

CL.*_*CL. 9

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

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