内存泄漏是coding中经常容易出现的问题, 而且很难查。 本文中总结了几个常见的内存泄漏问题, 分别举例实现, 并列出用代码分析工具——valgrind中memcheck检查的结果, 一 一对错误进行排查。
本文围绕工程valgrind-sample进行讲解。 先看下工程结构:
methods类写了几个可能存在内存操作问题的函数, main.cpp调用methods类函数:
methods.h:
#ifndef VALGRIND_METHODS_H
#define VALGRIND_METHODS_H
namespace sample{
void printx();
void access_violation();
void mem_overlap();
void nonfree();
}
#endif //VALGRIND_METHODS_H
main.cpp:
#include <iostream>
#include "methods.h"
#include <string.h>
int main(int argc, char *argv[]){
sample::printx();
sample::access_violation();
sample::mem_overlap();
sample::nonfree();
}
下面分别看这几个函数可能会遇到什么问题。
1. sample::printx()
void printx(){
int x;
if (x == 0)
{
printf("X is zero");
}
}
问题显而易见, 变量赋值前引用, 但C编译器并不会报错。
valgrind ./valgrind-sample:
==17495== Conditional jump or move depends on uninitialised value(s)
==17495== at 0x400D10: sample::printx() (in /home/zhangruiqing01/disk2/study/code/valgrind-samples/valgrind-samples)
==17495== by 0x400B4B: main (in /home/zhangruiqing01/disk2/study/code/valgrind-samples/valgrind-samples)