2012-04-25 2 views
0

현재 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()에 대한 포인터 주소를 전달해야합니까?

감사합니다.

답변

2

예이 경우 유효합니다. 그러나 sqlite3_finalize()는 메모리를 해제하는 것 (dealloc)이 아니라는 점에 유의하십시오. 또한 미리 컴파일 된 SQL 문 등을 삭제하라는 메시지를 DB에 보냅니다.

관련 문제