0

我从 CGImageRef 获取该数据,然后设置我创建的结构以指向该数据:

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

但是,当我执行产品-> 分析时,我收到了内存泄漏警告。

我认为原因是因为我不做 CFRelease(data)。但是,如果我这样做 myPix -> 数据会被修改。我怎样才能摆脱内存泄漏警告但让它正常工作?

4

1 回答 1

0

你只是在那里分配一个指针 - 丢弃 const (如果你写入它,则为未定义的行为),并处置所有者(释放分配给data- 当你读取或写入该内存区域时也未定义的行为)。

如果您想要该数据的可变副本,则必须创建自己的可变副本。您可以放心调用CFRelease(data)

有两种直接创建可变副本的方法:

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 回答