0
如果我有一個動態分配的字符串包含我傳遞給sqlite3_prepare_v2()的查詢,何時可以安全地釋放此字符串?立即在sqlite3_prepare_v2()之後?在sqlite3_step完成後?直到sqlite3_finalize()之後? nByte參數的值是否影響答案?將zSql arg釋放到sqlite3_prepare_v2?
如果我有一個動態分配的字符串包含我傳遞給sqlite3_prepare_v2()的查詢,何時可以安全地釋放此字符串?立即在sqlite3_prepare_v2()之後?在sqlite3_step完成後?直到sqlite3_finalize()之後? nByte參數的值是否影響答案?將zSql arg釋放到sqlite3_prepare_v2?
的sqlite3_prepare_v2()和sqlite3_prepare16_v2()接口 建議所有的新方案。爲保持向後兼容性,兩個較舊的接口保留爲 ,但不鼓勵使用它們。在 「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()
一個版本叫做創建副本的字符串...
我對文檔中的這些詞感到擔憂「_passing一個nByte參數,該參數等於輸入字符串中的字節數,包括nul - 終止字節,因爲這節省了SQLite不得不復制輸入字符串_「,但我想這是一個不相關的副本。 – 2012-08-12 13:56:57