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