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