Domanda

Ho passato le ultime ore cercando di trovare la perdita di memoria nel mio codice. Eccolo:

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];

ho cercato di seguire le poche regole di base della gestione della memoria di cacao, ma in qualche modo ci sembra essere ancora una perdita, io credo che sia una matrice che è fuoriuscita. E 'evidente se possibleMatches è grande. Si può provare il codice utilizzando qualsiasi file di grandi dimensioni come "~ / Desktop / file.txt", e come espressione di qualcosa che produce molti risultati quando grep-ing.

Qual è l'errore che sto facendo?

Grazie per qualsiasi aiuto!

- Ry

EDIT: ho appena usato il Clang Static Analyzer per trovare le perdite nel mio codice, ma non trova nessuno. Si trova solo inizializzazioni morti, ma coloro che non può essere responsabile delle mie perdite ...

È stato utile?

Soluzione

Qui:

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

Stai sovrascrivendo il puntatore all'oggetto string senza rilasciare o autoreleasing la stringa originale. Invece di rilasciare string alla fine del metodo, fare:

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

Altri suggerimenti

Un percorso probabile una soluzione è quella di utilizzare strumenti modello di perdite. Impostando la gamma di controllo per iniziare a poco prima di questo codice, poi guardando il quale gli stanziamenti sono ancora vivi dopo questo codice è tornato, si può vedere ciò che viene però trapelato, e poi guardare storie puntatore Le perdite e le corrispondenti tracce dello stack per vedere esattamente quello che è successo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top