0

CGImageRef からそのデータを取得し、作成した構造体をこのデータを指すように設定しています。

        CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
        const UInt8 * imageData = CFDataGetBytePtr(data);
        myPix->data = (l_uint32 *) imageData;

しかし、Product -> Analyze を実行すると、メモリ リークの警告が表示されます。

その理由はCFRelease(data)をしていないからだと思います。ただし、それを行うと myPix -> データが変更されます。メモリ リークの警告を取り除き、正しく動作させるにはどうすればよいですか?

4

1 に答える 1

0

そこにポインターを割り当てているだけです-constをキャストし(書き込みの場合は未定義の動作)、所有者を破棄します(割り当てられた割り当てを解放しdataます-そのメモリ領域を読み書きするときの未定義の動作も)。

そのデータの変更可能なコピーが必要な場合は、独自の変更可能なコピーを作成する必要があります。を安全に呼び出すことができますCFRelease(data)

変更可能なコピーを作成するには、次の 2 つの方法があります。

1) 使用malloc

  • を使用して新しい割り当てを作成しますmalloc
  • 次に、バッファをバッファにコピーdataします
  • 次に、バッファをに割り当てますmyPix->data
  • 割り当てmyPix->data参照が完了したら、呼び出しますfree(myPix->data);

2) CFData の変更可能なコピーを作成します。

CFMutableDataRef mutableData = CFDataCreateMutableCopy(0, 0, data);
myPix->data = (l_uint32 *)CFDataGetMutableBytePtr(mutableData);

割り当てmyPix->data参照が完了したら、呼び出しますCFRelease(mutableData);

于 2012-08-16T17:58:22.410 に答える