2016-05-25 3 views
1

Wenn ich ein CImage erstellen durch Aufruf dieser Routine bekomme ich den malloc Fehler im Titel. Wenn ich initWithBitmapData direkt aufruft (nicht in der Routine createCIUimageFromData), dann funktioniert es gut.Malloc Zeiger freigelassen wurde nicht zugeordnet Fehler beim Aufruf von initWithBitmapData

Ich habe Referenzen zu möglichen Fehlern in iOS gesehen, die verwandt sein könnten, aber ich kann nicht sicher sagen und ich verdächtige meinen Code mehr als Apples!

Meine Vermutung ist irgendwie meine zusätzliche Umleitung ist Dinge zu vermasseln, aber es ist sauberer, die separate Routine zu haben als den Code einzubetten, wo immer ich es brauche.

Vielen Dank.

schlägt fehl:

- (CIImage *) createCIimageFromData : (unsigned char *)pData width : (int32_t)width height : (int32_t)height 
{ 

    /* 
    Once we have the raw data, we convert it into a CIImage. 
    The following code does the required work. 
    */ 
    NSLog(@"entering createciimage\n"); 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray(); 

    NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ]; 
    CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef]; 

    CGColorSpaceRelease(colorSpaceRef); 

    /* 
    newImage is the final image 
    Do remember to release the allocated parts. 
    */ 
    NSLog(@"done ciimage\n"); 
    return _dataCIImage; 
} 

Works:

void prepData(unsigned char *pData, // source-destination 
          int strideSrc, // stride 
          int width, 
          int height, 
          double amount, 
          int deltaLimit, 
          id owner) 
{ 

    //[owner createCIimageFromData:pData width:width height:height]; // <-- commented out 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray(); 

    NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ]; 
    CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef]; 

    CGColorSpaceRelease(colorSpaceRef); 

// . . . 
} 
+0

Versuchen Sie 'freeWhenDone: NO', und geben Sie die Daten frei, nachdem Sie mit dem' CImage' fertig sind. – user3386109

+0

Danke, das scheint die Aufgabe erledigt zu haben! Wenn Sie es als Antwort hinzufügen, kann ich angeben, dass dies die Antwort war. – user938797

+0

@ user938797 Warten wir ab und sehen, ob jemand Ihnen sagen kann *** warum *** das ist die Antwort. Ich habe nur raten :) Es wäre nützlich zu wissen, was hinter den Kulissen passiert, die das Problem verursachen. Also wissen wir alle, was wir in Zukunft vermeiden sollten. – user3386109

Antwort

1

Offensichtlich ist das Problem verursacht wird, wenn das NSData Objekt versucht, die Daten zu befreien. Um das Problem zu vermeiden, verwenden Sie freeWhenDone:NO und geben Sie dann die Daten frei, nachdem Sie mit der CIImage fertig sind.

+0

Das Problem mit den 'NoCopy'-Methoden (unabhängig von' freeWhenDone') ist, dass Sie sicherstellen müssen, dass der Datenpuffer, auf den pData zeigt und auf den das Objekt 'NSData' verweist, so lange wie dieses' NSData'-Objekt existiert , die wahrscheinlich von der "CIImage" beibehalten wird. Also muss es so lange leben wie dieses 'CImage'. Und da beide Referenzen gezählt werden, ist nicht zu sagen, wie lange sie noch leben werden. Sie können vorbeileben, wenn du deine letzte starke Referenz auf sie loslässt, weil jeder Code, den sie jemals durchlaufen haben, sie aus irgendeinem Grund behalten könnte. –

+0

Danke Ken Thomases, das hilft auch. – user938797

Verwandte Themen