Hi The following vim script leaks memory at each iteration, using latest Vim-7.2.25:
:set spell :while 1 : copen : bd :endwhile Run this script with 'vim -u NONE -S leak.vim' and watch memory increasing steadily. Valgrind reports this leak: $ valgrind --leak-check=yes --num-callers=20 vim -u NONE -S leak.vim ... ==14170== 124,288 bytes in 3,884 blocks are definitely lost in loss record 65 of 65 ==14170== at 0x4022AE8: malloc (vg_replace_malloc.c:207) ==14170== by 0x81127C4: lalloc (misc2.c:859) ==14170== by 0x81126FB: alloc_clear (misc2.c:770) ==14170== by 0x811370D: ga_grow (misc2.c:1981) ==14170== by 0x817E875: did_set_spelllang (spell.c:4261) ==14170== by 0x8097922: do_ecmd (ex_cmds.c:3704) ==14170== by 0x8152AC1: ex_copen (quickfix.c:2336) ==14170== by 0x80A61E1: do_one_cmd (ex_docmd.c:2621) ==14170== by 0x80A3A84: do_cmdline (ex_docmd.c:1095) ==14170== by 0x80A1D20: do_source (ex_cmds2.c:3114) ==14170== by 0x80A163B: cmd_source (ex_cmds2.c:2741) ==14170== by 0x80A158F: ex_source (ex_cmds2.c:2714) ==14170== by 0x80A61E1: do_one_cmd (ex_docmd.c:2621) ==14170== by 0x80A3A84: do_cmdline (ex_docmd.c:1095) ==14170== by 0x80A3124: do_cmdline_cmd (ex_docmd.c:701) ==14170== by 0x80E7600: exe_commands (main.c:2683) ==14170== by 0x80E500F: main (main.c:873) The number of blocks leaked (3,884 here) is the number of iterations in the loop before I hit Ctrl-C. I'm using Vim-7.2.25, built with -O0 on Linux x86. Attached patch fixes it (+ typos in comments). Regards -- Dominique --~--~---------~--~----~------------~-------~--~----~ You received this message from the "vim_dev" maillist. For more information, visit http://www.vim.org/maillist.php -~----------~----~----~----~------~----~------~--~---
Index: buffer.c =================================================================== RCS file: /cvsroot/vim/vim7/src/buffer.c,v retrieving revision 1.83 diff -c -r1.83 buffer.c *** buffer.c 1 Sep 2008 15:32:55 -0000 1.83 --- buffer.c 22 Oct 2008 01:55:20 -0000 *************** *** 647,652 **** --- 647,655 ---- vim_free(buf->b_start_fenc); buf->b_start_fenc = NULL; #endif + #ifdef FEAT_SPELL + ga_clear(&buf->b_langp); + #endif } /* *************** *** 1880,1886 **** * "buf" if one exists */ if (swb_flags & SWB_USEOPEN) wp = buf_jump_open_win(buf); ! /* If 'switchbuf' contians "usetab": jump to first window in any tab * page containing "buf" if one exists */ if (wp == NULL && (swb_flags & SWB_USETAB)) wp = buf_jump_open_tab(buf); --- 1883,1889 ---- * "buf" if one exists */ if (swb_flags & SWB_USEOPEN) wp = buf_jump_open_win(buf); ! /* If 'switchbuf' contains "usetab": jump to first window in any tab * page containing "buf" if one exists */ if (wp == NULL && (swb_flags & SWB_USETAB)) wp = buf_jump_open_tab(buf); *************** *** 3964,3970 **** width = vim_strsize(out); if (maxwidth > 0 && width > maxwidth) { ! /* Result is too long, must trunctate somewhere. */ l = 0; if (itemcnt == 0) s = out; --- 3967,3973 ---- width = vim_strsize(out); if (maxwidth > 0 && width > maxwidth) { ! /* Result is too long, must truncate somewhere. */ l = 0; if (itemcnt == 0) s = out;