内存资源 ( strdup )

Posted

技术标签:

【中文标题】内存资源 ( strdup )【英文标题】:Memory resource ( strdup ) 【发布时间】:2013-08-29 09:12:12 【问题描述】:

我调用 strdup 来复制 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 后的内存泄漏

【问题讨论】:

避免内存泄漏的关键是在完成后释放分配的内存... 静态字符 *card=NULL, *channel=NULL;您不能将“麦克风”分配给通道,因为它没有与之关联的任何内存,只是一个指针。使用 char *channel[10] = ; 可能会更好 【参考方案1】:

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

这是 strdup 人的部分陈述:

char *strdup(const char *s);

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

【讨论】:

以上是关于内存资源 ( strdup )的主要内容,如果未能解决你的问题,请参考以下文章

函数strdup()

strdup() - 它在 C 中做了啥?

strcpy 与 strdup

linux C函数之strdup函数分析

double free or corruption的原因

高分求助!!!C内存泄露检测问题