2012-08-11 37 views
0

如果我有一個動態分配的字符串包含我傳遞給sqlite3_prepare_v2()的查詢,何時可以安全地釋放此字符串?立即在sqlite3_prepare_v2()之後?在sqlite3_step完成後?直到sqlite3_finalize()之後? nByte參數的值是否影響答案?將zSql arg釋放到sqlite3_prepare_v2?

回答

1

documentation

的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()一個版本叫做創建副本的字符串...

+0

我對文檔中的這些詞感到擔憂「_passing一個nByte參數,該參數等於輸入字符串中的字節數,包括nul - 終止字節,因爲這節省了SQLite不得不復制輸入字符串_「,但我想這是一個不相關的副本。 – 2012-08-12 13:56:57