user-0 提问: C语言中，如何检查调用一个函数之后，有无内存泄露。

回复:
user: user-1
content: 引用 26 楼 icesky1stm 的回复:[quote=引用 19 楼 max_min_ 的回复:] 让程序持续运行，查看内存使用情况吧！ 这个服务程序是给一个界面系统做服务端用的，所以新增加业务的时候，免不了要调用其他人自己写的程序。所以持续运行只能检查现有程序，不能让对以后新增加的程序做限制。  我目前折中的做法是，每次子进程调用了一定（可配置的）次数之后，舍弃掉。  哎，看来是没啥好办法了。[/quote] 《Unix编程艺术》

user: user-2
content: 引用 16 楼 zhao4zhong1 的回复:检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  PURIFY /BOUND CHECKER/ vc开DEBUG宏/xcode 的PROFILE 的LEAKS

user: user-3
content: 搜一下API钩子吧。 大概就是 用跳转指令，替换函数内部的前几条指令 这样就会先执行，你自己定义的函数  这几乎要用到汇编了，不过可以不用汇编，直接嵌入二进制代码。 大概就是这种　Jmp DOWROD PTR XXX　指令　xxx 是函数地址  这种指令写成数据，如果有权限改写代码块，先保存，原来的内容，用数据Jmp DOWROD PTR XXX 替换 函数前几条指令， 大概是6字节吧。Jmp指令代码是 0xFF 0x25 0xXXXXXXXX   0xXXXXXXXX 就是你字节的函数地址。

user: user-4
content: 学习了，厉害厉害

user: user-0
content: 引用 24 楼 lm_whales 的回复:[quote=引用 23 楼 Starmean 的回复:] 如果要完全自己实现的话，我有一个想法 自己写一个头文件，代替掉原来的内存分配头文件 等于是重写里面的malloc和free函数等函数 申请内存时，先调用真正的malloc函数，获得了内存指针后，将此指针做个记录 释放内存时，根据内存指针地址，把相应的记录给删除 最后，如果记录为0表示没有泄漏  调试完成后，就可以把原来的真正文件还原重新链接编译 ++  还有一种方式，就是API钩子的实现方式。  程序启动时替换 malloc 开头的几个指令，跳入你自己的malloc实现 然后，恢复 malloc 开头的几个指令 ，调用 malloc 结束，完毕后再次替换。  确保用户使用的是你自己的内存分配函数。 其他内存管理函数，也可以这么做。  这样，你就可以随便检查了。[/quote]  自己封装一下目前实现不了，以为要改好多现有的业务程序了。  API钩子的方式，可否详细说一下。 怎么调到自己的malloc里去，要用嵌入汇编么。

user: user-0
content: 引用 19 楼 max_min_ 的回复:让程序持续运行，查看内存使用情况吧！ 这个服务程序是给一个界面系统做服务端用的，所以新增加业务的时候，免不了要调用其他人自己写的程序。所以持续运行只能检查现有程序，不能让对以后新增加的程序做限制。  我目前折中的做法是，每次子进程调用了一定（可配置的）次数之后，舍弃掉。  哎，看来是没啥好办法了。

user: user-0
content: 引用 20 楼 jiandingzhe 的回复:valgrind  虽然valgrind不能解决这个问题，但是我也我用了一下啊，但是当连接ORACLE数据库的时候，提示我没有连接权限。 valgrind --tool=memcheck --leak-check=yes CounterServerPP CTS CTS-MIDI 55666这样执行，不是用的当前用户的权限， 有什么办法把权限放大么。

user: user-3
content: 引用 23 楼 Starmean 的回复:如果要完全自己实现的话，我有一个想法 自己写一个头文件，代替掉原来的内存分配头文件 等于是重写里面的malloc和free函数等函数 申请内存时，先调用真正的malloc函数，获得了内存指针后，将此指针做个记录 释放内存时，根据内存指针地址，把相应的记录给删除 最后，如果记录为0表示没有泄漏  调试完成后，就可以把原来的真正文件还原重新链接编译 ++  还有一种方式，就是API钩子的实现方式。  程序启动时替换 malloc 开头的几个指令，跳入你自己的malloc实现 然后，恢复 malloc 开头的几个指令 ，调用 malloc 结束，完毕后再次替换。  确保用户使用的是你自己的内存分配函数。 其他内存管理函数，也可以这么做。  这样，你就可以随便检查了。

user: user-5
content: 如果要完全自己实现的话，我有一个想法 自己写一个头文件，代替掉原来的内存分配头文件 等于是重写里面的malloc和free函数等函数 申请内存时，先调用真正的malloc函数，获得了内存指针后，将此指针做个记录 释放内存时，根据内存指针地址，把相应的记录给删除 最后，如果记录为0表示没有泄漏  调试完成后，就可以把原来的真正文件还原重新链接编译

user: user-6
content: 引用 18 楼 baipv008 的回复:用内存池，要求对方只从你的内存池里分配内存。  嗯，赞同，而且在C++中，可以通过重载operator new和operator delete来实现，自定义内存管理

user: user-7
content: 弄过一个资源管理器，将申请的内存，句柄，socket等全部进行注册，释放的时候就去注册。这样就随时查看注册的资源是否忘了释放。前提是提供申请资源的接口.

user: user-8
content: valgrind

user: user-9
content: 让程序持续运行，查看内存使用情况吧！

user: user-10
content: 用内存池，要求对方只从你的内存池里分配内存。

user: user-7
content: 引用 15 楼 icesky1stm 的回复:[quote=引用 8 楼 xihu1364 的回复:] [quote=引用 楼主 icesky1stm 的回复:] 如题。 如何才能检测出内存泄露。   char * m1=NULL; char * m2=NULL; m1 = malloc(1); free(m1);  Main_Flow(); /*主服务进程，内部有动态调用业务级函数库(dlopen) */  m2 = malloc(1); free(m2);  if( m1 != m2)     printf("主进程有内存泄露？？？？\n");   开个玩笑，请教下大家有啥好办法。 楼主思维还是挺好的，赞一个！但是不可行...[/quote] 才发现，是个假版主。。。[/quote] 我又不是版主，只版主的大哥，你懂的

user: user-1
content: 检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！

user: user-0
content: 引用 8 楼 xihu1364 的回复:[quote=引用 楼主 icesky1stm 的回复:] 如题。 如何才能检测出内存泄露。   char * m1=NULL; char * m2=NULL; m1 = malloc(1); free(m1);  Main_Flow(); /*主服务进程，内部有动态调用业务级函数库(dlopen) */  m2 = malloc(1); free(m2);  if( m1 != m2)     printf("主进程有内存泄露？？？？\n");   开个玩笑，请教下大家有啥好办法。 楼主思维还是挺好的，赞一个！但是不可行...[/quote] 才发现，是个假版主。。。

user: user-0
content: 引用 13 楼 user-11 的回复:这样是不行的，nt里面有freelist，这种招式，查不出内存泄露的。  推荐你看一下，java堆喷射里面的实现技巧，呵呵呵  用JAVA就会写个HELLO WORLD。。。。。。

user: user-11
content: 这样是不行的，nt里面有freelist，这种招式，查不出内存泄露的。  推荐你看一下，java堆喷射里面的实现技巧，呵呵呵

user: user-0
content: 引用 8 楼 xihu1364 的回复:[quote=引用 楼主 icesky1stm 的回复:] 如题。 如何才能检测出内存泄露。   char * m1=NULL; char * m2=NULL; m1 = malloc(1); free(m1);  Main_Flow(); /*主服务进程，内部有动态调用业务级函数库(dlopen) */  m2 = malloc(1); free(m2);  if( m1 != m2)     printf("主进程有内存泄露？？？？\n");   开个玩笑，请教下大家有啥好办法。 楼主思维还是挺好的，赞一个！但是不可行...[/quote]  版主大哥有混分的嫌疑。。。