我在命令行中调用strtoull()超过1亿次Objective-C OS X app计算汉明距离。我已经从ph_hamming_distance()跟踪了这个函数调用的~30字节/调用内存泄漏。我已经查看了strtoull()的BSD源代码,甚至切断了我不需要的通用性,并将源代码放入我的应用程序中,但仍然有内存泄漏。
主叫代码是:
NSArray * returnMatchedImagesFromDB(NSString * hash, NSString * asin, NSInteger action) {
/* Input hash, asin, action(not yet used)
* Calculate Hamming Distance to all records in DB
* Return NSArray of HammingDistanceRecords of matches within "hdCompareThreshold" of each other
*/
int hd;
int threshold = 0;
NSMutableArray * retArray = [[NSMutableArray alloc] init];
threshold = hdCompareThreshold;
// for each image in dbImageArray, compute hamming distance to all other images
for (ImageRecord *imgRecord in dbImageArray) {
hd = ph_hamming_distance(imgRecord.hash, hash);
if ((threshold == -1) || (hd <= threshold)) {
HammingDistanceRecord * hdRec = [[HammingDistanceRecord alloc] init];
hdRec.hammingDistance = hd;
hdRec.asin1 = asin;
hdRec.asin2 = imgRecord.asin;
hdRec.rank2 = imgRecord.rank;
[retArray addObject:hdRec];
}
}
return [retArray copy];
} // returnMatchedImagesFromDB()
int ph_hamming_distance(NSString * hashStr1,NSString * hashStr2) {
NSUInteger hash1 = strtoull([hashStr1 UTF8String],NULL,0);
NSUInteger hash2 = strtoull([hashStr2 UTF8String],NULL,0);
NSUInteger x = hash1^hash2;
const NSUInteger m1 = 0x5555555555555555ULL;
const NSUInteger m2 = 0x3333333333333333ULL;
const NSUInteger h01 = 0x0101010101010101ULL;
const NSUInteger m4 = 0x0f0f0f0f0f0f0f0fULL;
x -= (x >> 1) & m1;
x = (x & m2) + ((x >> 2) & m2);
x = (x + (x >> 4)) & m4;
return (x * h01)>>56;
}
ph_hamming_distance()的参数总是base10(没有alpha字符)。典型的hashStr是@“17609976980814024116”。我正在比较的对象数据库当前是390K对象,因此所有对象与其自身的内部比较是对strtoull()的300亿次调用。泄漏导致我的应用程序每次都以~3500比较SIGKILL -9。这是3500 * 390K * 2次调用/比较= ~80 GB这是我的驱动器上的可用空间,所以我猜OS X在交换文件填满驱动器时会终止进程。
任何帮助表示感谢。
答案 0 :(得分:1)
这可能是您的[hashStr1 UTF8String]
来电,这将分配一个char*
缓冲区,该缓冲区在您的自动发布上下文清理之前不会被释放,这可能是&#34;从不&#34;如果您在循环中调用所有这些内容而不返回到NSRunLoop
。请参阅示例What is the guaranteed lifecycle of -[NSString UTF8String]?