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