我有一个返回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是安全的选择,但如果不需要,我想避免复制/性能命中,因为这个查询将会运行很多.
在您的情况下,返回的字符串对象GetIpString()很可能在查询执行和最终确定之前被破坏,因此您应该这样做SQLITE_TRANSIENT.
一般情况下,您不应该为临时副本而烦恼,除非您有实际的性能问题,而这些问题是由此引起的.
| 归档时间: |
|
| 查看次数: |
5196 次 |
| 最近记录: |