私は現在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()へのポインタのアドレスを渡す必要がありますか?
ありがとうございました!