2013-04-16 65 views
2

我有一個方法返回一個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是安全的選擇,但是如果不需要它,我想避免複製/性能命中,因爲這個查詢會運行很多。

回答

5

在你的情況下,由GetIpString()返回的字符串對象很可能在查詢執行完成之前被破壞,所以你應該SQLITE_TRANSIENT

通常情況下,除非您有實際的性能問題,否則您不應該擔心臨時副本。