stming中的内存泄漏汉明距离计算中的strtoull()调用

时间:2017-04-17 19:34:56

标签: objective-c macos hash memory-leaks strtoull

我在命令行中调用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在交换文件填满驱动器时会终止进程。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

这可能是您的[hashStr1 UTF8String]来电,这将分配一个char*缓冲区,该缓冲区在您的自动发布上下文清理之前不会被释放,这可能是&#34;从不&#34;如果您在循环中调用所有这些内容而不返回到NSRunLoop。请参阅示例What is the guaranteed lifecycle of -[NSString UTF8String]?