首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用sqlite时,我有6MB内存泄漏

在使用sqlite时,我有6MB内存泄漏
EN

Stack Overflow用户
提问于 2012-02-26 22:57:19
回答 1查看 1.1K关注 0票数 1

当我使用sqlite时,有6MB的内存泄漏。现在我正在测试getBookWithIdTest方法。

代码语言:javascript
复制
-(IBAction) onTest:(id)sender
{
 NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
 for (int i=0; i<100; i++) 
 {
    [DatabaseManager getBookWithIdTest:i];
 }
 [myPool drain];    
} 

我有6 MB的内存泄漏。但是为什么呢?

代码语言:javascript
复制
+ (BookSettings *)getBookWithIdTest:(int)abookId
{
  BookSettings *book = [[[BookSettings alloc] init] autorelease];    
  sqlite3 *database;

  if(sqlite3_open([DatabaseManager databasePath], &database) == SQLITE_OK) 
  {
    sqlite3_stmt *compiledStatement;

    //FIRST PART
    const char *sqlStatementBook = [[NSString stringWithFormat:@"SELECT * FROM t_abooks"] cStringUsingEncoding:NSASCIIStringEncoding];

    if(sqlite3_prepare_v2(database, sqlStatementBook, -1, &compiledStatement, NULL) == SQLITE_OK)
    {            
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
        {               
        }             
    } 
    else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));

    sqlite3_reset(compiledStatement);
   //END FIRST PART
    // SECOND PART
    const char *sqlStatementAuthors = [[NSString stringWithFormat:@"SELECT * FROM t_authors"] cStringUsingEncoding:NSASCIIStringEncoding];

    if(sqlite3_prepare_v2(database, sqlStatementAuthors, -1, &compiledStatement, NULL) == SQLITE_OK)
    {
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
        {                
        }            
    } 
    else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));

    sqlite3_reset(compiledStatement);
    //END SECOND PART
    sqlite3_finalize(compiledStatement);
} else NSLog(@"sqlite3_open error");

sqlite3_close(database);
return book;
}  

但如果我删除了第一部分或第二部分,我就不会有任何泄漏。例如

代码语言:javascript
复制
+ (BookSettings *)getBookWithIdTest:(int)abookId
{
BookSettings *book = [[[BookSettings alloc] init] autorelease];    
sqlite3 *database;

if(sqlite3_open([DatabaseManager databasePath], &database) == SQLITE_OK) 
{
    sqlite3_stmt *compiledStatement;

    //FIRST PART -removed        
    // SECOND PART
    const char *sqlStatementAuthors = [[NSString stringWithFormat:@"SELECT * FROM t_authors"] cStringUsingEncoding:NSASCIIStringEncoding];

    if(sqlite3_prepare_v2(database, sqlStatementAuthors, -1, &compiledStatement, NULL) == SQLITE_OK)
    {
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
        {                
        }            
    } 
    else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));

    sqlite3_reset(compiledStatement);

    sqlite3_finalize(compiledStatement);
} else NSLog(@"sqlite3_open error");

sqlite3_close(database);
return book;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-27 05:07:22

我解决了这个问题。我需要添加

代码语言:javascript
复制
sqlite3_finalize(compiledStatement);

到第一部分的末尾。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9454099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档