可能是内存访问不好?

时间:2012-04-25 01:56:29

标签: objective-c memory-leaks sqlite

我目前正在使用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()中的out参数。应该在该函数中分配内存。因此,应该通过调用sqlite3_finalize()来释放它。

我的问题是,如果我们从PrepareStmt()返回sqlite3_stmt,它应该仍然有效吗? PrepareStmt()中的本地指针已经从堆栈弹出,但sqlite3_prepare_v2()分配的内存应该仍然有效。

这种想法有效吗?或者我是否需要传入指向PrepareStmt()的指针地址?

谢谢!

1 个答案:

答案 0 :(得分:2)

是的,在这种情况下它是有效的。但请注意,sqlite3_finalize()不只是关于释放内存(即dealloc)。它还向DB发送一条消息,告诉它删除它的预编译SQL语句等等......