3

複数のクエリに再利用している文字列バッファがあります。したい:

  1. 文字列を割り当てます
  2. に渡しますsqlite3_bind_text
  3. でステートメントを実行しますsqlite3_step
  4. でステートメントをリセットしますsqlite3_reset
  5. 2に行く

私は大丈夫だと思いますが、SQLiteがこの時点以降の文字列へのポインタを必要としないことを誰かが確認できますか?

4

1 に答える 1

3

sqlite3_reset()バインディングは、ルーチンによってクリアされません。詳細については、SQLite バインディングのドキュメントを参照してください。ステートメントが再度実行されると、バインディングが再利用されます。

ステートメントがステップ実行される前にもう一度パラメーターがバインドされている限り、文字列を解放しても安全であるというケースを作成できます。安全のために、割り当てられた文字列を解放する前に、パラメーターを静的文字列にバインドできます。

以下のコメントと洗練された要件に基づく補遺:

バッファを解放するのではなく再利用したい場合、最も安全な方法は、sqlite_reset の後にバッファを変更し、次の sqlite3_step の前に、変更されたバッファで sqlite3_bind_text を呼び出すことです。この場合、バインディング タイプ( の 5 番目の引数) として使用SQLITE_STATICsqlite3_bind_textします。

を使用SQLITE_TRANSIENTすると、sqlite に強制的に文字列がコピーされます。このオプションを使用すると、 を呼び出した直後にバッファを再利用できますsqlite3_bind_text。この場合、それは必要ありません。SQLITE_STATICメモリ割り当てをなくすことで、より効率的に使用できます。

于 2012-08-25T14:12:00.690 に答える