我调用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后帮我防止内存泄漏
答案 0 :(得分:0)
函数 strdup 使用 malloc 分配内存。如果你想避免因 strdup 导致的内存泄漏,你必须释放strdup的返回值(在你的情况下是变量 card )不再使用数据。
以下是 strdup 男子的一部分:
char *strdup(const char *s);
strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。使用 malloc(3)获取新字符串的内存,并且可以 释放 free(3)。