我有将整数转换为字节数组的功能(对于iPhone)。为了增加动态性,我使用malloc分配了数组。但我认为这会泄漏记忆。什么是管理这种记忆的最佳方式,
+ (unsigned char *) intToByteArray:(int)num{
unsigned char * arr = (unsigned char *)
malloc(sizeof(num) * sizeof(unsigned char));
for (int i = sizeof(num) - 1 ; i >= 0; i --) {
arr[i] = num & 0xFF;
num = num >> 8;
}
return arr;
}
致电时,
int x = 500;
unsigned char * bytes = [Util intToByteArray:x];
我想避免调用free(bytes),因为调用函数不知道或明确知道,内存是分配的而不是释放的。
答案 0 :(得分:3)
完成字节后调用free(bytes);
(在方法结束时或在类的dealloc中)
因为你想避免空闲调用,你可以将你的byte []包装在NSData对象中:
NSData *d = [NSData dataWithBytesNoCopy:bytes length:num freeWhenDone:YES];
答案 1 :(得分:3)
一些事情:
根据定义,char
类型(以及signed char
和unsigned char
)的大小均为1,因此不需要sizeof(unsigned char)
。
看起来您只想获取int
对象的字节表示,如果是这种情况,则无需为其分配更多空间,只需获取{的地址即可{1}}并将其转换为指向int
的指针。如果字节顺序错误,您可以使用unsigned char *
函数交换NSSwapInt
中字节的顺序,然后取地址并转换为int
。例如:
unsigned char *
此演员表是合法的,从int someInt = 0x12345678;
unsigned char *bytes = (unsigned char *) &someInt;
开始阅读是合法的,直到读取bytes
个字节为止。这是访问“对象表示”。
如果您坚持使用sizeof(int)
,则只需在完成后将缓冲区传递给malloc
,如:
free
您的方法名称不意味着返回缓冲区的正确所有权。如果您的方法返回调用者负责释放的内容,则通常使用free(bytes);
,new
或有时copy
来命名方法。更合适的名称是create
或类似名称。否则,您可以让方法接受预先分配的缓冲区并调用方法copyBytesFromInt:
,例如:
getBytes:fromInt:
您可以将+ (void) getBytes:(unsigned char *) bytes fromInt:(int) num
{
for (int i = sizeof(num) - 1 ; i >= 0; i --) {
bytes[i] = num & 0xFF;
num = num >> 8;
}
}
打包到bytes
个实例中:
NSData
确保您的方法遵循通常的对象所有权规则。
答案 2 :(得分:1)
传统的处理方法是让调用者传入一个分配的字节缓冲区。这样调用者负责释放它。类似的东西:
int x = 500;
char *buffer = malloc(x * sizeof(char));
[Util int:x toByteArray:buffer];
…
free(buffer);
我还会考虑创建一个NSData来保存字节,这会照顾你的内存管理,同时仍允许你改变字节缓冲区:
+ (NSData *) intToByteArray:(int)num {
unsigned char * arr = (unsigned char *)
malloc(sizeof(num) * sizeof(unsigned char));
for (int i = sizeof(num) - 1 ; i >= 0; i --) {
arr[i] = num & 0xFF;
num = num >> 8;
}
return [NSData dataWithBytesNoCopy:arr length:num freeWhenDone:YES];
}