I'm having trouble tracking down why it leaks, but below is an example program which shows--using valgrind--that vorbis_info_clear() leaks memory if called before vorbis_dsp_clear(), but not if called after vorbis_dsp_clear(). Just compile and run under valgrind, using the -l switch to the example program to trigger a leak. Tested under OS X 10.7 and Ubuntu 12.04. This may be by design, or just, "don't do that". If it is the Wiki page should probably be edited to mention this. I tried, but it didn't look like I could make the edit. My solution is to clear in reverse order of initialization, though I've rearranged the order of things in the example program to highlight the immediate issue. /* compile: cc -Wall -o vbs vbs.c -lvorbisenc -lvorbis */ /* noleak: valgrind --leak-check=yes ./vbs */ /* leak: valgrind --leak-check=yes ./vbs -l */ #include <unistd.h> /* getopt(3) */ #include <vorbis/codec.h> #include <vorbis/vorbisenc.h> static struct vorbis_info info; static struct vorbis_dsp_state dsp; static struct vorbis_comment comment; static struct vorbis_block block; void init(void) { struct { ogg_packet ident, comment, setup; } pkt; vorbis_info_init(&info); vorbis_encode_init_vbr(&info, 2, 44100, 1.0); vorbis_analysis_init(&dsp, &info); vorbis_comment_init(&comment); vorbis_analysis_headerout(&dsp, &comment, &pkt.ident, &pkt.comment, &pkt.setup); vorbis_block_init(&dsp, &block); } /* init() */ void destroy(_Bool leak) { vorbis_block_clear(&block); if (leak) vorbis_info_clear(&info); vorbis_dsp_clear(&dsp); if (!leak) vorbis_info_clear(&info); vorbis_comment_clear(&comment); } /* destroy() */ int main(int argc, char *argv[]) { _Bool leak = 0; int opt; while (-1 != (opt = getopt(argc, argv, "l"))) { switch (opt) { case 'l': leak = 1; break; } } init(); destroy(leak); return 0; } /* main() */