如果我有一个动态分配的包含要传递给sqlite3_prepare_v2()的查询的字符串,那么何时可以安全地释放此字符串?在sqlite3_prepare_v2()之后吗?在sqlite3_step之后完成了吗?直到sqlite3_finalize()之后? nByte参数的值会影响答案吗?

最佳答案

documentation


  sqlite3_prepare_v2()和sqlite3_prepare16_v2()接口是
  建议用于所有新程序。两个较旧的接口是
  保留以向后兼容,但不建议使用。在
  “ v2”接口,返回的准备好的语句(
  sqlite3_stmt对象)包含原始SQL文本的副本。


我相信这意味着您可以在调用sqlite3_prepare_v2()之后立即安全地释放或修改字符串。

编辑:

沿着sqlite3.c代码的简短提示显示了这个小片段:

SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, int isPrepareV2){
  assert( isPrepareV2==1 || isPrepareV2==0 );
  if( p==0 ) return;
#ifdef SQLITE_OMIT_TRACE
  if( !isPrepareV2 ) return;
#endif
  assert( p->zSql==0 );
  p->zSql = sqlite3DbStrNDup(p->db, z, n);
  p->isPrepareV2 = (u8)isPrepareV2;
}


基本上,如果由sqlite3_prepare_v2()调用,则会调用strndup()版本来创建字符串的副本...

关于c - 将zSql arg释放到sqlite3_prepare_v2吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11917073/

10-11 14:24