目录
C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
内存泄漏的原因?
内存泄漏是在没有自动gc的编程语言里面,经常发生的一个问题。因为没有gc,所以分配的内存需要程序员自己调用释放。其核心原因是调用分配与释放没有符合开闭原则,没有配对,形成了有分配,没有释放的指针,从而产生了内存泄漏。
{
void*p1=malloc(s2);
void*p2=malloc(s1);
free(p1);
}
以上代码段,分配了s1,s2大小的内存块分配由p1与p2指向。而代码块执行完以后,释放了p1,而p2没有释放。形成了有分配没有释放的指针,产生了内存泄漏。
内存泄漏会产生哪些后果?
随着工程代码量越来越多,自然内存泄漏的排查就成为了一个很头疼的问题。有分配没有释放,自然会使得进程堆的内存会越来越少,直到耗尽。会造成后面的运行时代码不能成功分配内存。
内存泄漏如何解决?
内存泄漏是没有自动gc的编程语言所产生的
解决方案一,引入gc。这是根治内存泄漏的最好的方案。但是这样的方案有失去了c/c++语言的优势。
方案二,当发生内存泄漏的时候,能够精准的定位代码哪一行所引起的。这也是我们实现内存泄漏检测的如何核心实现需求。
需求1:能够检测出来内存泄漏
需求2:能够判断是由代码哪一行引起的内存泄漏
内存泄漏检测如何实现?
内存泄漏是由于内存分配与内存释放,不匹配所引起的。对内存分配函数malloc/calloc/realloc,以及内存释放free进行“劫持”hook。能够统计出内存分配的位
置,内存释放的位置,从而判断是否匹配。
方案一:采用__libc_malloc,__libc_malloc与__builtin_return_address
方案二:采用宏定义
方案三:借助malloc.h里面malloc_hook