释放使用malloc分配的内存的最佳方法

时间:2012-12-20 10:30:22

标签: objective-c malloc

我有将整数转换为字节数组的功能(对于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),因为调用函数不知道或明确知道,内存是分配的而不是释放的。

3 个答案:

答案 0 :(得分:3)

完成字节后调用free(bytes);(在方法结束时或在类的dealloc中)


因为你想避免空闲调用,你可以将你的byte []包装在NSData对象中:

NSData *d = [NSData dataWithBytesNoCopy:bytes length:num freeWhenDone:YES];

答案 1 :(得分:3)

一些事情:

  1. 根据定义,char类型(以及signed charunsigned char)的大小均为1,因此不需要sizeof(unsigned char)

    < / LI>
  2. 看起来您只想获取int对象的字节表示,如果是这种情况,则无需为其分配更多空间,只需获取{的地址即可{1}}并将其转换为指向int的指针。如果字节顺序错误,您可以使用unsigned char *函数交换NSSwapInt中字节的顺序,然后取地址并转换为int。例如:

    unsigned char *

    此演员表是合法的,从int someInt = 0x12345678; unsigned char *bytes = (unsigned char *) &someInt; 开始阅读是合法的,直到读取bytes个字节为止。这是访问“对象表示”。

  3. 如果您坚持使用sizeof(int),则只需在完成后将缓冲区传递给malloc,如:

    free
  4. 您的方法名称意味着返回缓冲区的正确所有权。如果您的方法返回调用者负责释放的内容,则通常使用free(bytes); new或有时copy来命名方法。更合适的名称是create或类似名称。否则,您可以让方法接受预先分配的缓冲区并调用方法copyBytesFromInt:,例如:

    getBytes:fromInt:
  5. 您可以将+ (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];
}