相关疑难解决方法(0)

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

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

c++ sqlite

5
推荐指数
1
解决办法
5196
查看次数

标签 统计

c++ ×1

sqlite ×1