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はnilに設定されており、sqlite3_prepare_v2()からの出力パラメーターになります。その関数でメモリを割り当てる必要があります。したがって、sqlite3_finalize()を呼び出して解放する必要があります。

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

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

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

4

1 に答える 1

2

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

于 2012-04-25T02:12:05.987 に答える