【发布时间】: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