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() */