2016-10-31 36 views
0

기존 사운드 코드를 수정 중이며 하드웨어에 구성 데이터를 쓰는 것을 마치면 snd_pcm_hw_params_free()을 호출하지 않습니다. 기존의 이유로 응용 프로그램은 사운드 하드웨어가 재생할 때마다 사운드 하드웨어를 열고 닫습니다. 이것은 snd_pcm_hw_params_t *이 결코 free'd가 아니기 때문에 메모리 누출을 야기해야합니다. 그래서 snd_pcm_hw_params_free()와`에 대한 호출을 추가 이제 다음과 같은 오류 얻을 :ALSA : snd_pcm_hw_params_free()가 메모리 오류를 일으켰습니다.

[[email protected] namb2]# ./freetest 
*** glibc detected *** ./freetest: free(): invalid pointer: 0xbfe39000 *** 
======= Backtrace: ========= 
/lib/libc.so.6[0xb75dc595] 
/lib/libc.so.6(cfree+0x59)[0xb75dc9d9] 
/emsnamb/namb2/lib/libasound.so.2(snd_pcm_hw_params_free+0x1d)[0xb7707bad] 
./freetest[0x804876b] 
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7588e9c] 
./freetest(memset+0x31)[0x80485b1] 
======= Memory map: ======== 
08048000-08049000 r-xp 00000000 00:0e 5413865 /var/tmp/namb2/freetest 
08049000-0804a000 rwxp 00000000 00:0e 5413865 /var/tmp/namb2/freetest 
0804a000-08094000 rwxp 00000000 00:00 0   [heap] 
b74f1000-b74fc000 r-xp 00000000 fe:00 48544  /lib/libgcc_s-4.1.2-20080825.so.1 
b74fc000-b74fd000 rwxp 0000a000 fe:00 48544  /lib/libgcc_s-4.1.2-20080825.so.1 
b7506000-b7516000 rwxs 00000000 00:04 149192707 /SYSV0056a4d6 (deleted) 
b7516000-b7526000 rwxs 00000000 00:0d 1789  /dev/snd/pcmC0D0p 
b7526000-b7527000 rwxp 00000000 00:00 0 
b7527000-b752e000 r-xp 00000000 fe:00 48586  /lib/librt-2.5.so 
b752e000-b752f000 r-xp 00006000 fe:00 48586  /lib/librt-2.5.so 
b752f000-b7530000 rwxp 00007000 fe:00 48586  /lib/librt-2.5.so 
b7530000-b7531000 rwxp 00000000 00:00 0 
b7531000-b7544000 r-xp 00000000 fe:00 48582  /lib/libpthread-2.5.so 
b7544000-b7545000 r-xp 00013000 fe:00 48582  /lib/libpthread-2.5.so 
b7545000-b7546000 rwxp 00014000 fe:00 48582  /lib/libpthread-2.5.so 
b7546000-b7548000 rwxp 00000000 00:00 0 
b7548000-b754a000 r-xp 00000000 fe:00 48536  /lib/libdl-2.5.so 
b754a000-b754b000 r-xp 00001000 fe:00 48536  /lib/libdl-2.5.so 
b754b000-b754c000 rwxp 00002000 fe:00 48536  /lib/libdl-2.5.so 
b754c000-b7571000 r-xp 00000000 fe:00 48557  /lib/libm-2.5.so 
b7571000-b7572000 r-xp 00024000 fe:00 48557  /lib/libm-2.5.so 
b7572000-b7573000 rwxp 00025000 fe:00 48557  /lib/libm-2.5.so 
b7573000-b76b2000 r-xp 00000000 fe:00 48509  /lib/libc-2.5.so 
b76b2000-b76b4000 r-xp 0013f000 fe:00 48509  /lib/libc-2.5.so 
b76b4000-b76b5000 rwxp 00141000 fe:00 48509  /lib/libc-2.5.so 
b76b5000-b76b8000 rwxp 00000000 00:00 0 
b76be000-b76bf000 rwxs 81000000 00:0d 1789  /dev/snd/pcmC0D0p 
b76bf000-b76c0000 r-xs 80000000 00:0d 1789  /dev/snd/pcmC0D0p 
b76c0000-b76c1000 rwxs 00000000 00:04 149159938 /SYSV0056a4d5 (deleted) 
b76c1000-b779b000 r-xp 00000000 fe:00 48500  /lib/libasound.so.2.0.0 
b779b000-b77a0000 rwxp 000d9000 fe:00 48500  /lib/libasound.so.2.0.0 
b77a0000-b77a1000 rwxp 00000000 00:00 0 
b77a1000-b77a2000 r-xp 00000000 00:00 0   [vdso] 
b77a2000-b77bc000 r-xp 00000000 fe:00 48490  /lib/ld-2.5.so 
b77bc000-b77bd000 r-xp 00019000 fe:00 48490  /lib/ld-2.5.so 
b77bd000-b77be000 rwxp 0001a000 fe:00 48490  /lib/ld-2.5.so 
bfe1a000-bfe3b000 rwxp 00000000 00:00 0   [stack] 
Aborted 

아래의 테스트 프로그램이 문제를 보여줍니다. 이것은 libasound의 설치가 어떤 식 으로든 손상되었음을 나타 냅니까?

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

int main(int argc, char *argv[]) 
{ 
    snd_pcm_t *handle; 
    snd_pcm_hw_params_t *params; 
    int rc; 

    if((rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0)) < 0) 
    { 
     printf("Playback open error: %s\n", snd_strerror(rc)); 
     exit(EXIT_FAILURE); 
    } 

    /* Allocate a hardware parameters object. */ 
    snd_pcm_hw_params_alloca(&params); 

    /* Fill it in with default values. */ 
    if (snd_pcm_hw_params_any(handle, params) < 0) 
    { 
     fprintf(stderr, "Can not configure this PCM device.\n"); 
     snd_pcm_close(handle);  
     return(-1); 
    } 

    /* Write the parameters to the driver */ 
    if ((rc = snd_pcm_hw_params(handle, params)) < 0) 
    { 
     fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc)); 
     snd_pcm_close(handle);  
     return -1; 
    } 

    snd_pcm_hw_params_free(params); 
    snd_pcm_close(handle); 

    return 0; 
} 

답변

4

snd_pcm_hw_params_alloca() 문서 말한다

allocate an invalid snd_pcm_hw_params_t using standard alloca

표준 alloca() 함수 스택에서 메모리를 할당하고; 이 메모리는 함수가 종료 될 때 자동으로 해제됩니다.

snd_pcm_hw_params_malloc()으로 할당 된 개체에만 snd_pcm_hw_params_free()을 사용할 수 있습니다.

+0

오우. 나는 RTFM을 가져야한다. 고맙습니다! – Chimera