修改CFDataGetBytePtr返回的数据时的EXC_BAD_ACCESS

时间:2016-07-31 13:36:32

标签: heap-memory readonly objective-c++ dataprovider cgimageref

长话短说,我想捕获一个窗口,然后修改字节缓冲区:

struct CaptureObject
    {
        unsigned char* bgraData;
        CFDataRef bgraDataRef;
        CGDataProviderRef provider;
        int width;
        int height;
        int bytesPerRow;
    };

CaptureObject obj;

CGImageRef windowImage = CGWindowListCreateImage(captureCGRect, kCGWindowListOptionIncludingWindow, windowId, kCGWindowImageBoundsIgnoreFraming | kCGWindowImageShouldBeOpaque);

obj.width = CGImageGetWidth(windowImage);
obj.height = CGImageGetHeight(windowImage);
obj.bytesPerRow = CGImageGetBytesPerRow(windowImage);

obj.provider = CGImageGetDataProvider(windowImage);
obj.bgraDataRef = CGDataProviderCopyData(obj.provider);
obj.bgraData = const_cast<unsigned char*>(CFDataGetBytePtr(obj.bgraDataRef));

//Read and right obj.bgraData;

CGImageRelease(windowImage);
CFRelease(browserImage.bgraDataRef);
CGDataProviderRelease(browserImage.provider);

我可以读取数据,但在尝试写入此缓冲区时遇到崩溃。 正如documentation&#39; CFDataGetBytePtr&#39;中明确注意到的那样:

  

返回指向CFData对象字节的只读指针。

但它究竟意味着什么?如果这只是一种编译语法,我认为&#39; const_cast&#39;应该解决这个问题所以我的问题是操作系统如何管理分配对象&#34;只读&#34;段(类似于&#34;代码段&#34;);

P.S。我试图避免使用&#39; CFDataGetByte&#39;这实际上是复制数据,因为它对我来说太贵了。

0 个答案:

没有答案