2012-12-20 75 views
1

我有函數將整數轉換爲字節數組(iPhone版)。爲了增加動態性,我使用malloc分配數組。但我認爲這會泄漏記憶。什麼是管理這個內存最好的方式,釋放使用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]; 

我想避免由於呼叫免費(字節),調用函數不知道或者不明確的人都知道,內存是分配和不釋放。

+0

釋放它最後由'free()'? –

+0

這種方法的問題在於,函數的調用者不知道是否釋放指針而不查看實現或註釋。這就是OP爲什麼要求替代品的原因。 – nhahtdh

+0

使用NSData來包裝字節 –

回答

3

幾件事:

  1. char類型(和signed charunsigned char)根據定義都有1的大小,所以sizeof(unsigned char)是不必要的。

  2. 看起來你只是想獲得一個int對象的字節表示,如果是這樣的話,沒有必要爲它分配更多的空間,簡單地採取int的地址,並將其轉換爲指向unsigned char *。如果字節順序錯誤,則可以使用NSSwapInt函數交換int中字節的順序,然後獲取地址並將其轉換爲unsigned char *。例如:

    int someInt = 0x12345678; 
    unsigned char *bytes = (unsigned char *) &someInt; 
    

    這個轉換是合法的,直到sizeof(int)字節讀取bytes讀書是合法的。這是訪問「對象表示」。

  3. 如果你堅持要用malloc,那麼你只需要在緩衝區傳遞到free當您完成,如:

    free(bytes); 
    
  4. 你的方法也暗示的正確名稱返回的緩衝區的所有權。如果您的方法返回呼叫者負責釋放的內容,則通常使用newcopy或有時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; 
        } 
    } 
    
  5. 你可以換你bytesNSData實例:

    NSData *data = [NSData dataWithBytesNoCopy:bytes length:sizeof(num) freeWhenDone:YES]; 
    

    確保你的方法遵循通常的對象所有權規則。

+0

謝謝。我需要這個函數,因爲iOS將LSB存儲在long/int數字的第一個字節中。 data = [NSData dataWithBytes:&l length:8];返回我需要的錯誤字節順序。但我不知道NSSwapInt/Long函數。感謝您的提示。這將解決我的問題。然後我不需要編寫任何函數來將int/long轉換爲字節。 – karim

3

只要打電話free(bytes);當你用字節做(無論是在方法或類的dealloc結束)


,因爲要避免免費通話,你可以換你的字節[ ]在一個NSData對象:

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

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]; 
}