2013-08-26 3 views
-2

Я называю strdup продублировать «карты» строка в set_device (имя_устройства) set_device (имя_устройства) , а затем я использую «карты», чтобы открыть смеситель:ресурс памяти (strdup)

имя_устройства в формате ш: 0/Mic

static char *card, *channel; 
static snd_mixer_t *handle = NULL; 
static snd_mixer_elem_t *elem = NULL; 
static long min, max, vol; 

static void open_mixer(void) 
{ 
     int err; 
     static snd_mixer_selem_id_t *sid = NULL; 
     if ((err = snd_mixer_open (&handle, 0)) < 0) { 
      return; 
     } 
     if ((err = snd_mixer_attach (handle, card)) < 0) { /* memory leak */ 
      goto error; 
     } 
     if ((err = snd_mixer_selem_register (handle, NULL, NULL)) < 0) { 
      goto error; 
     } 
     if ((err = snd_mixer_load (handle)) < 0) { 
      goto error; 
     } 
     snd_mixer_selem_id_malloc(&sid); 
     if (sid == NULL) 
      goto error; 
     snd_mixer_selem_id_set_name(sid, channel); 
     if (!(elem = snd_mixer_find_selem(handle, sid))) { 
      goto error; 
     } 
     if (!snd_mixer_selem_has_playback_volume(elem)) { 
      goto error; 
     } 
     snd_mixer_selem_get_playback_volume_range(elem, &min, &max); 
     if ((max - min) <= 0) { 
      goto error; 
     } 
     snd_mixer_selem_id_free(sid); 
     return; 

error: 
     if (sid) 
      snd_mixer_selem_id_free(sid); 
     if (handle) { 
      snd_mixer_close(handle); 
      handle = NULL; 
     } 
     return; 
} 

int set_device(const char *devname) 
{ 
     int i; 

     if (card) free(card); 
     card = strdup(devname); 
     if(!card) return -1; 

     i = strcspn(card, "/"); 
     if(i == strlen(card)) { 
      channel = "Mic"; 
     } else { 
      card[i] = 0; 
      channel = card + i + 1; 
     } 
     open_mixer(); 
     if (!handle) { 
      fprintf(stderr, "mixer: Can't open mixer %s, volume unavailable.\n", card); 
      return -1; 
     } 
     return 0; 
} 

Пожалуйста, помогите мне, чтобы предотвратить утечку памяти после вызова strdup

+0

Ключом к предотвращению утечек памяти является освобождение выделенной памяти, как только вы закончите с ней ... –

+0

static char * card = NULL, * channel = NULL; Вы не можете назначить «Mic» на канал, потому что у него нет связанной с ним памяти, просто указатель. Возможно, вам будет лучше с char * channel [10] = {}; – Jiminion

ответ

0

функции strdup выделяет память с таНосом. Если вы хотите избежать утечки памяти из-за strdup вы должны освободить возвращаемое значение strdup (в вашем случае переменная card), когда вы больше не используете данные.

Вот часть strdup человека, который гласит следующее:

char *strdup(const char *s); 

strdup() функция возвращает указатель на новую строку, которая является дубликатом строки s. Память для новой строки получена с malloc (3) и может быть освобождена с бесплатно (3).