0

sqlite3_prepare_v2() に渡すクエリを含む動的に割り当てられた文字列がある場合、いつこの文字列を安全に解放できますか? sqlite3_prepare_v2()の直後?sqlite3_step が完了したら? sqlite3_finalize() の後までではありませんか? nByte パラメータの値は答えに影響しますか?

4

1 に答える 1

1

ドキュメントから:

sqlite3_prepare_v2() および sqlite3_prepare16_v2() インターフェイスは、すべての新しいプログラムに推奨されます。2 つの古いインターフェイスは下位互換性のために残されていますが、使用はお勧めできません。「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 に答える