我的程序中存在内存泄漏,因为我不熟悉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);
由于
答案 0 :(得分:0)
更多评论而不是答案,因为我还没有看到你如何泄漏记忆(还没有足够的评论来评论)。您是如何观察内存泄漏的?你能看到被泄漏的对象里面有什么东西,然后通过它的分配堆栈跟踪来查看它是什么吗?
您也可以提供sqlRawStrings的声明吗?
顺便说一句,我认为你构建字符串的方式可以改进。考虑使用sprintf。您可能还想考虑使用.mm文件而不是.m,然后您将获得C ++功能; std :: string类可以帮到你。
最后,除非您已成功打开它,否则不要关闭某些内容,即“sqlite3_close”应与sqlite3_exec位于同一块内。
'希望这有用。
答案 1 :(得分:0)
最好的猜测是sqlRawStrings
永远不会被释放,因此也没有添加任何内容。