2012-04-25 37 views
0

私は現在Objective-Cでsqlite3を使って開発中です。次のコードは、悪いメモリアクセスのようです。メモリアクセスに問題がある可能性がありますか?

-(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(から出力パラメータであろう。メモリはその機能で割り当てられるべきです。したがって、sqlite3_finalize()を呼び出すことで解放されます。

ここで私の質問は、PrepareStmt()からsqlite3_stmtを返すと、それでも有効なはずです。 PrepareStmt()のローカルポインタはすでにスタックからポップされていますが、sqlite3_prepare_v2()によって割り当てられたメモリは有効なはずです。

これは有効ですか?またはPrepareStmt()へのポインタのアドレスを渡す必要がありますか?

ありがとうございました!

答えて

2

はい、この場合有効です。しかし、sqlite3_finalize()はメモリを解放するだけではないことに注意してください(つまりdealloc)。また、DBにメッセージを送信して、プリコンパイルされたSQL文などをドロップするように指示します。

関連する問題