我在我的命令行調用strtoull()超過1億次Objective-C OS X應用程序計算海明距離。我從ph_hamming_distance()函數調用了一個〜30字節/調用內存泄漏。我已經看過BSD源代碼strtoull(),甚至砍掉了我不需要的一般性,並將源代碼放入應用程序中,但仍然存在內存泄漏。在海明()調用內存泄漏海明距離計算
調用代碼是:
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(沒有阿爾法字符)。典型的hashStr是@「17609976980814024116」。我正在比較的對象數據庫目前是390K對象,因此所有對象的內部比較是對strtoull()的300億次調用。泄漏導致我的應用程序SIGKILL -9在每次3500比較。這是3500 * 390K * 2調用/比較=〜80 GB這是我的驅動器上的自由空間,所以我猜OS X在交換文件填滿驅動器時正在終止進程。
任何幫助表示讚賞。
我的猜測是它比'strtoull'更多。你可以顯示你的循環執行'ph_hamming_distance'的調用嗎? – Alden