5

我有一个返回 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() 的第五个参数是一个析构函数,用于在 SQLite 完成后处理 BLOB 或字符串。即使对 sqlite3_bind_blob()、sqlite3_bind_text() 或 sqlite3_bind_text16() 的调用失败,也会调用析构函数来处理 BLOB 或字符串。如果第五个参数是特殊值 SQLITE_STATIC,则 SQLite 假定信息位于静态、非托管空间中,不需要释放。如果第五个参数的值为 SQLITE_TRANSIENT,则 SQLite 在 sqlite3_bind_*() 例程返回之前立即制作自己的数据私有副本。

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

4

1 回答 1

10

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

一般来说,您不应该为临时副本而烦恼,除非您有实际的性能问题,您认为这是由它引起的。

于 2013-04-16T18:26:48.197 回答