如果我有一个动态分配的包含要传递给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/