内存资源(strdup)

时间:2013-08-26 19:28:55

标签: c memory-leaks alsa strdup

我调用strdup来复制set_device(devname)中的'card'字符串 set_device(devname) 然后我用'卡'打开调音台:

devname的格式为hw: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后帮我防止内存泄漏

1 个答案:

答案 0 :(得分:0)

函数 strdup 使用 malloc 分配内存。如果你想避免因 strdup 导致的内存泄漏,你必须释放strdup的返回值(在你的情况下是变量 card )不再使用数据。

以下是 strdup 男子的一部分:

char *strdup(const char *s);
  

strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。使用 malloc(3)获取新字符串的内存,并且可以          释放 free(3)