Не могу найти утечку в моем коде - PullRequest
0 голосов
/ 01 апреля 2010

Я провел последние несколько часов, пытаясь найти утечку памяти в моем коде. Вот оно:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

expression = [expression stringByTrimmingCharactersInSet:
              [NSCharacterSet whitespaceAndNewlineCharacterSet]]; // expression is an NSString object.

NSArray *arguments = [NSArray arrayWithObjects:expression, [@"~/Desktop/file.txt" stringByExpandingTildeInPath], @"-n", @"--line-number", nil];
NSPipe *outPipe = [[NSPipe alloc] init];

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/bin/grep"];
[task setArguments:arguments];
[task setStandardOutput:outPipe];
[outPipe release];

[task launch];

NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];

[task waitUntilExit];
[task release];

NSString *string = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];
string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@""];

int linesNum = 0;

NSMutableArray *possibleMatches = [[NSMutableArray alloc] init];

if ([string length] > 0) {

    NSArray *lines = [string componentsSeparatedByString:@"\n"];
    linesNum = [lines count];

    for (int i = 0; i < [lines count]; i++) {

        NSString *currentLine = [lines objectAtIndex:i];
        NSArray *values = [currentLine componentsSeparatedByString:@"\t"];

        if ([values count] == 20)
            [possibleMatches addObject:currentLine];
    }
}
[string release];
[pool release];

return [possibleMatches autorelease];

Я пытался следовать нескольким основным правилам управления памятью Какао, но каким-то образом все еще кажется утечка, я полагаю, что это утечка массива. Заметно, если возможно большие совпадения. Вы можете попробовать код, используя любой большой файл как "~ / Desktop / file.txt" и как выражение, которое дает много результатов при grep-ing.

Какую ошибку я совершаю?

Спасибо за любую помощь!

- Ry

РЕДАКТИРОВАТЬ: я просто использовал Clang Static Analyzer, чтобы найти утечки в моем коде, но он не находит. Он находит только мертвые инициализации, но они не могут быть ответственны за мои утечки ...

Ответы [ 2 ]

3 голосов
/ 02 апреля 2010

Здесь:

NSString *string = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];
string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@""];

Вы перезаписываете указатель объекта string, не освобождая или автоматически освобождая исходную строку. Вместо освобождения string в конце метода выполните:

NSString *string = [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding] autorelease];
string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@""];
0 голосов
/ 04 апреля 2010

Вероятный путь к решению - использовать шаблон «Утечки инструментов». Установив диапазон проверки для запуска непосредственно перед этим кодом, затем посмотрев, какие выделения еще живы после того, как этот код вернулся, вы можете увидеть, что произошло утечка, а затем посмотреть историю указателей утечек и соответствующие трассировки стека, чтобы увидеть точно что случилось.

...