NCurses内存分配valgrind消息

时间:2016-07-22 01:09:54

标签: c++ memory memory-leaks ncurses

我最近一直在教自己NCurses,我决定在valgrind中测试我的代码以检查是否有任何内存泄漏。这个少量的代码给出了与我的程序相同的错误结果,我想知道是否有人知道它有什么问题或者可以指导我找到答案。

#include <ncurses.h>
int main()
{
    initscr();
    WINDOW *win = newwin(0,0,10,10);
    delwin(win);
    endwin();
    return 0;
}

== 20986 == Memcheck,内存错误检测器
== 20986 ==版权所有(C)2002-2013,以及Julian Seward等人的GNU GPL'd。 == 20986 ==使用Valgrind-3.10.1和LibVEX;用-h重新运行版权信息
== 20986 ==命令:./ a.out
== 20986 ==
== 20986 ==
== 20986 == HEAP SUMMARY:
== 20986 ==在退出时使用:193块中的281,089字节
== 20986 ==总堆使用量:248个allocs,55个frees,353,425个字节分配
== 20986 ==
== 20986 ==泄漏摘要:
== 20986 ==绝对丢失:0块中的0字节
== 20986 ==间接丢失:0块中的0字节
== 20986 ==可能丢失:0个块中的0个字节
== 20986 ==仍然可达:193块中的281,089字节
== 20986 ==抑制:0块中的0字节
== 20986 ==重新运行--leak-check = full以查看泄露内存的详细信息 == 20986 ==
== 20986 ==对于检测到的和抑制的错误计数,请重新运行:-v
== 20986 ==错误摘要:0个上下文中的0个错误(被抑制:0从0开始)

感谢您的时间。

3 个答案:

答案 0 :(得分:3)

显示的代码没有任何问题。各种运行时库在运行时为其内部缓冲区分配内存是正常的,而不会在共享库卸载时取消分配它们。

答案 1 :(得分:1)

图书馆经常在int main()结束后做事。

话虽如此,后面会发生的事情的一个例子如下:

#7  0x00007ffff72abfe8 in __run_exit_handlers (status=0, 
  listp=0x7ffff76355f8 <__exit_funcs>, 
  run_list_atexit=run_list_atexit@entry=true) at exit.c:82
#8  0x00007ffff72ac035 in __GI_exit (status=<optimized out>) at exit.c:104
#9  0x00007ffff7292837 in __libc_start_main (
  main=0x429e26 <main(int, char**)>, argc=1, argv=0x7fffffffde28, 
  init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, 
  stack_end=0x7fffffffde18) at ../csu/libc-start.c:325
#10 0x0000000000419f69 in _start ()

在一个示例程序中。以上输出由GDB提供。但是,相关性在stacktrace第7行,您会看到一个部分显示listp=0x7ffff76355f8;这是注册到atexit();函数的函数回调列表。可能在ncurses中使用的任何东西,甚至一些std / stl库都可以在那里进行清理。一般来说,或者至少在我读过的时候,valgrind总是无法接受那些免费的资源,因为调用库正在管理它们的清理。

答案 2 :(得分:1)

答案在ncurses FAQ Testing for Memory Leaks中:

  

也许您使用 dmalloc valgrind 等工具来检查内存泄漏。它通常会报告仍在使用的大量内存。这很正常。

     

ncurses configure 脚本有一个选项--disable-leaks,您可以使用该选项继续分析。如果可能的话,它告诉ncurses释放内存。但是,大多数使用中的内存都是“永久性的”。

     

任何curses 的实现都不能 释放与屏幕关联的内存,因为(即使在调用endwin()之后),它必须可用于下次调用refresh()。出于性能原因,还有大量的内存。这使得很难分析curses应用程序的内存泄漏。要解决这个问题,请构建一个ncurses库的调试版本,它可以释放它可以使用的那些块,并提供_nc_free_and_exit()函数以在退出时释放剩余部分。 ncurses实用程序和test programs使用此功能,例如,通过ExitProgram()宏。

例如,Debian提供了可能对测试内存泄漏有用的软件包:libncurses5-dbglibncursesw5-dbg