我有一個方法返回一個C++ std :: string,然後在將它傳遞到sqlite3_bind_text之前將它轉換爲c_str()。我的問題是,如果這是使用SQLITE_STATIC或SQLITE_TRANSIENT?sqlite3_bind_text SQLITE_STATIC vs SQLITE_TRANSIENT for C++ string
sqlite3_bind_text(insertStatement, 0, suspect->GetIpString().c_str(), -1, SQLITE_STATIC);
// Do some stuff in same function then sqlite3_step
爲sqlite3_bind_text文檔說,
第五個參數,以sqlite3_bind_blob(),sqlite3_bind_text(),和 sqlite3_bind_text16()是一種用於處置BLOB的或SQLite的後 串的析構已經完成了它。即使對sqlite3_bind_blob(), sqlite3_bind_text()或sqlite3_bind_text16()的調用失敗,也會調用析構函數 處置BLOB或字符串。如果第五個 參數是特殊值SQLITE_STATIC,那麼SQLite假定 信息處於靜態非託管空間,並且不需要爲 釋放。如果第五個參數的值爲SQLITE_TRANSIENT,則 SQLite會在 sqlite3_bind _ *()例程返回之前立即生成其自己的數據私有副本。
GetIpString返回一個std :: string,但是如果我沒有明確地創建它的副本,那麼在調用之後該字符串會繼續存在嗎?另外,一般不使用SQLITE_TRANSIANT是否安全使用.c_str()?我知道SQLITE_TRANSIENT是安全的選擇,但是如果不需要它,我想避免複製/性能命中,因爲這個查詢會運行很多。