正确免费的alsa混音器资源

时间:2018-04-21 19:23:19

标签: c valgrind alsa

我正在编写一些简单的Alsa初始化代码来设置混音器,我将使用它来设置音量等等。但是,即使使用建议的内存释放方法,即使基本代码也有内存泄漏,例如snd_config_update_free_global() 。如果有人可以查看该片段,让我知道我错过了什么,我将不胜感激。谢谢!

#include <alsa/asoundlib.h>
#include <stdio.h>
#include <stdlib.h>

void PrintAlsaError(const char * str, int error_code) {
    fprintf(stderr, str, snd_strerror(error_code));
}

int main() {
    snd_mixer_t * handle;
        snd_mixer_selem_id_t * sid;
        snd_mixer_elem_t * elem;
        const char * card = "default";

    int error_code;
    if ((error_code = snd_mixer_open(&handle, 0)) < 0) {
        PrintAlsaError("unable to open handle, error: %s\n", error_code);
        return -1;
    } else if ((error_code = snd_mixer_attach(handle, card)) < 0) {
        PrintAlsaError("unable to attach to card, error: %s\n", error_code);
        snd_mixer_close(handle);
        return -1;
    } else if ((error_code = snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
        PrintAlsaError("unable to register handle, error: %s\n", error_code);
        snd_mixer_close(handle);
        return -1;
    } else if ((error_code = snd_mixer_load(handle)) < 0) {
        PrintAlsaError("unable to load handle, error: %s\n", error_code);
        snd_mixer_close(handle);
        return -1;
    }

    snd_mixer_selem_id_alloca(&sid);
    if (!sid) {
        fprintf(stderr, "couldn't get selem id\n");
    }

    if (!(elem = snd_mixer_first_elem(handle))) {
        fprintf(stderr, "no elements in mixer\n");
    }
    snd_mixer_selem_get_id(elem, sid);

    snd_mixer_close(handle);

    snd_config_update_free_global();

    return 0;
}

这是valgrind输出:

==8389== HEAP SUMMARY:
==8389==     in use at exit: 69,442 bytes in 193 blocks
==8389==   total heap usage: 6,912 allocs, 6,719 frees, 591,848 bytes allocated
==8389== 
==8389== LEAK SUMMARY:
==8389==    definitely lost: 0 bytes in 0 blocks
==8389==    indirectly lost: 0 bytes in 0 blocks
==8389==      possibly lost: 0 bytes in 0 blocks
==8389==    still reachable: 69,442 bytes in 193 blocks
==8389==         suppressed: 0 bytes in 0 blocks
==8389== Rerun with --leak-check=full to see details of leaked memory
==8389== 
==8389== For counts of detected and suppressed errors, rerun with: -v
==8389== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

0 个答案:

没有答案