複数のクエリに再利用している文字列バッファがあります。したい:
- 文字列を割り当てます
- に渡します
sqlite3_bind_text
- でステートメントを実行します
sqlite3_step
- でステートメントをリセットします
sqlite3_reset
- 2に行く
私は大丈夫だと思いますが、SQLiteがこの時点以降の文字列へのポインタを必要としないことを誰かが確認できますか?
複数のクエリに再利用している文字列バッファがあります。したい:
sqlite3_bind_text
sqlite3_step
sqlite3_reset
私は大丈夫だと思いますが、SQLiteがこの時点以降の文字列へのポインタを必要としないことを誰かが確認できますか?
sqlite3_reset()
バインディングは、ルーチンによってクリアされません。詳細については、SQLite バインディングのドキュメントを参照してください。ステートメントが再度実行されると、バインディングが再利用されます。
ステートメントがステップ実行される前にもう一度パラメーターがバインドされている限り、文字列を解放しても安全であるというケースを作成できます。安全のために、割り当てられた文字列を解放する前に、パラメーターを静的文字列にバインドできます。
以下のコメントと洗練された要件に基づく補遺:
バッファを解放するのではなく再利用したい場合、最も安全な方法は、sqlite_reset の後にバッファを変更し、次の sqlite3_step の前に、変更されたバッファで sqlite3_bind_text を呼び出すことです。この場合、バインディング タイプ( の 5 番目の引数) として使用SQLITE_STATIC
sqlite3_bind_text
します。
を使用SQLITE_TRANSIENT
すると、sqlite に強制的に文字列がコピーされます。このオプションを使用すると、 を呼び出した直後にバッファを再利用できますsqlite3_bind_text
。この場合、それは必要ありません。SQLITE_STATIC
メモリ割り当てをなくすことで、より効率的に使用できます。