-2

我调用 strdup 在 set_device(devname) set_device(devname) 中复制“card”字符串,然后使用“card”打开混音器:

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 后防止内存泄漏

4

1 回答 1

0

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

这是strdup人的部分说明:

char *strdup(const char *s);

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

于 2013-08-26T21:38:35.650 回答