使用“unsigned char”指向原始数据缓冲区时需要了解内存管理
Posted
技术标签:
【中文标题】使用“unsigned char”指向原始数据缓冲区时需要了解内存管理【英文标题】:Need to understand memory management when using "unsigned char" to point to raw data buffer 【发布时间】:2011-02-10 23:35:17 【问题描述】:我的问题在下面的代码中。我想了解在“unsigned char”指针方面是否存在“保留”之类的东西。请解释一下。
// MyObject.h
@interface myObject : NSObject
unsigned char *myData;
// MyObject.m
-(void)makeNewData
if (myData) free(myData);
myData = [self createBitmapContextData:myCGImageRef];
//Here is my question: do I need a "retain" call equivalent on the next line?
//[myData retain];
- (unsigned char*)createBitmapContextData:(CGImageRef)fromImage
CGContextRef cgctx = [self createARGBBitmapContextFromImage:myCGImage];
if (cgctx == NULL) return nil;
size_t w = CGImageGetWidth(myCGImage);
size_t h = CGImageGetHeight(myCGImage);
CGRect rect = 0,0,w,h;
CGContextDrawImage(cgctx, rect, myCGImage);
unsigned char* data = CGBitmapContextGetData (cgctx);
CGContextRelease(cgctx);
return data;
【问题讨论】:
NSData 是原始缓冲区的对象包装器。会这样吗? @macross 可能,我需要更多帮助。假设我这样做:NSData *myNSData = [[NSData alloc]initWithBytes:data length:sizeof(data)];
如何使用 NSData 访问 data[index]
?
【参考方案1】:
不,没有“保留”原始指针这样的事情。
正如 mackross 所说,NSData
可用于在您自己分配数据时保留数据。但是,在这种情况下,您并不拥有数据,您只是从拥有它的CGContext
“获取”它。当CGContext
发布时,您的参考将失效。在这种情况下,您需要拥有对上下文的引用,直到不再需要指针为止。
【讨论】:
谢谢。这正是我需要理解的部分。以上是关于使用“unsigned char”指向原始数据缓冲区时需要了解内存管理的主要内容,如果未能解决你的问题,请参考以下文章
有没有合法的方法将 unsigned char 指针转换为 std::byte 指针?
将 unsigned char 缓冲区与 node-ffi 一起使用
unsigned char 到 8 个原始位的 unsigned char 数组