2012-03-31 4 views
0

Правильно ли это, что она будет утечка памяти в C?Свободная память вне функции

unsigned char * prep(int length,int args, ...) 
{ 
    unsigned char *message = (unsigned char *) malloc(length); 

    va_list listp; 
    va_start(listp, args); 

    int i = 0; 
    int len = 0; 
    unsigned char *source_message ; 
    int step = 0; 
    for(i = 0 ; i < args; i++) 
    { 

    source_message = va_arg(listp, unsigned char *); 
    len = va_arg(listp, long); 
    memcpy(message+step, source_message, (long) len); 
    step+=len; 

    } 
    va_end(listp); 
return message; 
} 

, чем назвать его и освободить указатель за пределами

unsigned char *mess = prepare_packet_to_send(some vars here); 
free(*mess); 
+3

Не должно быть «бесплатно (беспорядок)»? – Rookie

ответ

0

Это нормально, иногда вам нужно это делать, функция C функции strdup() делает то же самое, вам просто нужно следовать соглашению, чтобы освободить ее после использования. Но я видел большую проблему в вашем коде, вы фактически позволяете записывать больше данных, чем размер, который вы выделили. Это попытка исправить это:

unsigned char * prep(int length,int args, ...) 
{ 
int i = 0; 
int len = 0; 
unsigned char *source_message ; 
int step = 0; 
unsigned char *message = (unsigned char *) malloc(length); 
va_list listp; 
va_start(listp, args); 
for(i = 0 ; i < args && step <= length; i++) { 
    source_message = va_arg(listp, unsigned char *); 
    len = va_arg(listp, long); 
    memcpy(message+step,source_message,(step+len >length)?length-step:len); 
    step+=len; 
} 
va_end(listp); 
return message; 
} 

использовать его как.

char * p = prep(size,2,"message 1",9,"message 2",9); 
if (p) { 
.... work with p.... 
    free(p); 
} 
2

Это правильно, это будет утечка памяти. Пока вы не забываете освободить возвращаемое значение этой функции, вы все равно должны быть в порядке.

+1

Это не «утечка» памяти, пока вы не потеряли ссылку на выделенную память. Полностью можно использовать код OP правильно. Сравните это с '{malloc (10); } ', который на самом деле * течет *. –

2

Это совершенно законно. Функции могут возвращать память, предназначенную для освобождения в другом месте. Фактически, функция malloc, которую вы используете, имеет это точное контрактное поведение.

Я не тщательно прошел через ваш код, чтобы проверить, нет ли других проблем, но возврат памяти malloc'd определенно не является проблемой.

1

Вы будете использовать свою собственную функцию, как это:

unsigned char *p = prep(100, 1, "hello", 3); 
// ... 
free(p); 

, и тогда вы не будете иметь никаких утечек памяти.

Смежные вопросы