2012-04-25 57 views
0

我目前正在使用sqlite3開發Objective-C。下面的代碼看起來像一個不好的內存訪問。內存訪問可能不好?

-(sqlite3_stmt *)PrepareStmt:(NSString *)query 
{ 
    //... 
    const char *query_stmt = [query UTF8String]; 
    sqlite3_stmt *stmt = nil; 
    int retval = 0; 

    if ((retval = sqlite3_prepare_v2(db, query_stmt, -1, &stmt, nil)) == SQLITE_OK) 
    { 
     return stmt; 
    } 
    else 
    { 
     //Error handling... 
    } 
} 

- (void)SomeFunc 
{ 
    NSString *query = @""; //Assume valid SQL statement 
    sqlite3_stmt *stmt = [self PrepareStmt:query]; 

    //Use stmt, like step, etc. 

    sqlite3_finalize(stmt); 
} 

在PrepareStmt的sqlite3_stmt被設置爲零,這將是從sqlite3_prepare_v2 out參數()。內存應該在該函數中分配。因此,它應該通過調用sqlite3_finalize()來釋放。

我在這裏的問題是,如果我們從PrepareStmt()返回sqlite3_stmt,它應該仍然有效嗎? PrepareStmt()中的本地指針已經從堆棧中彈出,但由sqlite3_prepare_v2()分配的內存仍然有效。

這種想法是否有效?或者我需要傳遞一個指向PrepareStmt()的地址嗎?

謝謝!

回答

2

是的,在這種情況下它是有效的。但請注意,sqlite3_finalize()不僅僅是釋放內存(即dealloc)。它還會向DB發送一條消息,告訴它放棄預編譯的SQL語句,等等......