0

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

4

1 回答 1

1

文档中:

建议所有新程序使用 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()来创建字符串的副本...

于 2012-08-11T21:22:46.693 回答