Свободная память вне функции - PullRequest
0 голосов
/ 01 апреля 2012

Это правильно, будет ли утечка памяти в 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);

Ответы [ 4 ]

2 голосов
/ 01 апреля 2012

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

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

2 голосов
/ 01 апреля 2012

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

1 голос
/ 01 апреля 2012

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

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

и тогда у вас не будет утечек памяти.

0 голосов
/ 01 апреля 2012

Хорошо, иногда вам приходится это делать, функция 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...