2013-02-12 115 views
0

的問題是:驗證控制器問題

Memory is never released; potential leak of memory pointed to by 'p' 

在代碼它發生在該單線方法的返回:

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length 
{ 
    return [NSString stringWithUTF8String:base64_encode(input, (size_t)length)]; 
} 

BASE64_ENCODE功能:

char* base64_encode(const void* buf, size_t size) 
{ 
    static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

    char* str = (char*) malloc((size+3)*4/3 + 1); 

    char* p = str; 
    unsigned char* q = (unsigned char*) buf; 
    size_t i = 0; 

    while(i < size) { 
     int c = q[i++]; 
     c *= 256; 
     if (i < size) c += q[i]; 
     i++; 

     c *= 256; 
     if (i < size) c += q[i]; 
     i++; 

     *p++ = base64[(c & 0x00fc0000) >> 18]; 
     *p++ = base64[(c & 0x0003f000) >> 12]; 

     if (i > size + 1) 
      *p++ = '='; 
     else 
      *p++ = base64[(c & 0x00000fc0) >> 6]; 

     if (i > size) 
      *p++ = '='; 
     else 
      *p++ = base64[c & 0x0000003f]; 
    } 

    *p = 0; 

    return str; 
} 

回答

2

你應該free(str)後轉換char *NSString

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length 
{ 
    char *base64 = base64_encode(input, length); 
    NSString *ret = [NSString stringWithUTF8String:base64]; 
    free(base64); 
    return ret; 
} 
+0

解決方案奏效。謝謝! – h4cky 2013-02-12 09:33:39

0

存儲器分配與malloc功能必須發佈與free,你必須改變噸他行

*p = 0; 

free(p); 
+0

後,我做的,我已經收到:'的內存使用它被釋放後' - 在base64_encode返回語句中。 – h4cky 2013-02-12 09:24:32

+0

是的,你是對的,'p'和'str'指向同一個地址,所以你不能釋放它,我檢查了我在一箇舊項目中實現它的方式,它是@Tomas建議 – tkanzakic 2013-02-12 09:33:40

+0

您的幫助我很感激。謝謝! – h4cky 2013-02-12 09:35:26