如何正确关闭并释放ALSA(和hw params)资源? 我找到了很多例子。各不相同。所有人都有memleak。
例如:
#include <stdio.h>
#include <unistd.h>
#include <alsa/asoundlib.h>
int
main()
{
snd_pcm_t *dev;
snd_pcm_open(&dev, "default", SND_PCM_STREAM_PLAYBACK, 0);
snd_pcm_close(dev);
return 0;
}
Valgrind报告:
==19586== LEAK SUMMARY:
==19586== definitely lost: 0 bytes in 0 blocks
==19586== indirectly lost: 0 bytes in 0 blocks
==19586== possibly lost: 65,525 bytes in 2,020 blocks
==19586== still reachable: 298 bytes in 6 blocks
==19586== suppressed: 0 bytes in 0 blocks
==19586== Reachable blocks (those to which a pointer was found) are not shown.
==19586== To see them, rerun with: --leak-check=full --show-reachable=yes
==19586==
==19586== ERROR SUMMARY: 116 errors from 116 contexts (suppressed: 4 from 4)
--19586--
--19586-- used_suppression: 2 dl-hack3-cond-1
--19586-- used_suppression: 2 glibc-2.5.x-on-SUSE-10.2-(PPC)-2a
==19586==
==19586== ERROR SUMMARY: 116 errors from 116 contexts (suppressed: 4 from 4)
UPD:
没有snd_pcm_close(),我们在117个上下文中有117个错误)))
答案 0 :(得分:0)
如果您通过调用snd_config_update_free_global()来释放全局配置,那么您将无法获得泄漏:snd_pcm_close(handle);
答案 1 :(得分:0)
使用alsalib 1.1.4.1测试此示例:
#include <stdio.h>
#include <unistd.h>
#include <alsa/asoundlib.h>
int main()
{
snd_pcm_t *dev;
snd_pcm_open(&dev, "default", SND_PCM_STREAM_PLAYBACK, 0);
snd_pcm_close(dev);
snd_config_update_free_global();
return 0;
}
根据Paolo的建议添加snd_config_update_free_global(),valgrind会显示很多这样的警告:
4,320 bytes in 60 blocks are possibly lost in loss record 91 of 94
摘要显示可能丢失的块:
==499== LEAK SUMMARY:
==499== definitely lost: 0 bytes in 0 blocks
==499== indirectly lost: 0 bytes in 0 blocks
==499== possibly lost: 43,011 bytes in 1,311 blocks
==499== still reachable: 111,131 bytes in 128 blocks
==499== suppressed: 0 bytes in 0 blocks
==499== Reachable blocks (those to which a pointer was found) are not shown.
==499== To see them, rerun with: --leak-check=full --show-leak-kinds=all
可以做些什么?