【问题标题】:Simple Memory Management Question In Objective-CObjective-C 中的简单内存管理问题
【发布时间】:2010-09-06 00:30:50
【问题描述】:

我的程序中存在内存泄漏,因为我不太精通 C(在我的 Objective-C 类中创建了一个函数来从 SQLite 数据库加载字符串)。谁能看出我的错误?谢谢:

static int MyCallback(void *context, int lCount, char **values, char **columns){

NSMutableArray *sqlRawStrings = (NSMutableArray *)context;
for (int i = 0; i < lCount; i++) {
    const char *nameCString = values[i];
    if (nameCString != NULL) {
        [sqlRawStrings addObject:[NSString stringWithUTF8String:nameCString]];
    }
} 

return SQLITE_OK;

}

所有这一切都在这里之前调用过:

int numberA = [loadBundleNumber intValue];
char str1[130] = "select ";
for(int i = 7; i <7 + numberA; i++){
    str1[i] = 'a';
}
char str2[20] = " from puzzles";
strcat(str1,str2);

NSString *file = [[NSBundle mainBundle] pathForResource:@"finalPuzzles" ofType:@"db"];
sqlite3 *database = NULL;
if (sqlite3_open([file UTF8String],&database) == SQLITE_OK) {
    sqlite3_exec(database, str1, MyCallback, sqlRawStrings, NULL);
}
sqlite3_close(database);

谢谢

【问题讨论】:

  • 那是Objective C,与C不同。
  • 虽然我也不是很精通,但我可以认真地看到你并没有破坏一次使用过的东西。
  • 您是否考虑过与将替换 malloc/free 等的内存管理工具链接?让工具完成工作,它可能会发现一些晦涩难懂的泄漏,甚至代码审查都可能错过(事实上,即使使用 Splint 进行 linting)也可能标记一些问题)
  • 我对 SQLlite 不太熟悉,但是在调用 sqlite3_exec 的地方和回调函数内部似乎都存在“sqlRawStrings”,在哪里声明了 sqlRawStrings?

标签: objective-c sqlite memory memory-leaks


【解决方案1】:

比答案更多的 cmets,因为我还没有看到你是如何泄漏内存的(还没有足够的点来评论)。您如何观察到内存泄漏?你能看到正在泄漏的对象内部有什么,并通过它的分配堆栈跟踪来查看它是什么吗?

您还可以提供 sqlRawStrings 的声明吗?

顺便说一句,我认为您构建琴弦的方式可以改进。考虑使用 sprintf。您可能还想考虑使用 .mm 文件而不是 .m 文件,然后您将获得 C++ 功能; std::string 类可以帮助你。

最后,除非你已经成功打开它,否则不要关闭它,即“sqlite3_close”应该与 sqlite3_exec 在同一块内。

'希望这会有所帮助。

【讨论】:

  • 感谢您的评论克里斯。 sqlRawStrings 是在程序加载时声明的实例变量: sqlRawStrings = [[NSMutableArray alloc] init];我通过 Apple 的 Instruments 工具了解了内存泄漏。
  • 您是否尝试过消除回调被调用以查看内存泄漏是否消失,即您是否隔离了泄漏? (尝试将 NULL 作为回调传递给 exec 函数)
  • 我还认为您的代码是在运行循环中执行的?如果没有,那么您的 stringWithUTF8String 和其他一些方法将会泄漏,因为它们的自动释放永远不会实现。
  • 我正是这样做的,我发现了程序在哪里泄漏。真的很感激!
  • 您是否介意当时我的回复和/或声称它是答案?并可能编辑您的问题以详细说明答案是什么?谢谢。
【解决方案2】:

最好的猜测是sqlRawStrings 从未发布过,因此也没有添加任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多