【问题标题】:Possibly bad memory access?可能是错误的内存访问?
【发布时间】:2012-04-25 10:12:05
【问题描述】:

我目前正在使用 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() 的指针地址?

谢谢!

【问题讨论】:

    标签: objective-c memory-leaks sqlite


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多