首先我们可以在程序中加入如下代码
#ifdef __MALLOC__
static void* __FUN_MALLOC__(const char *file, const int line, const char *function, const int size)
{
void *p=malloc(size);
fprintf(stdout," [%s:%d:%s] malloc heap addr:%X\n",file,line,function,(unsigned int)p);
fflush(stdout);
return p;
}
static void __FUN_FREE__(const char *file, const int line, const char *function, void *p)
{
free(p);
fprintf(stdout," [%s:%d:%s] free heap addr:%X\n",file,line,function,(unsigned int)p);
fflush(stdout);
return;
}
#define MALLOC(size) __FUN_MALLOC__(__FILE__,__LINE__,__FUNCTION__,size)
#define FREE(p) __FUN_FREE__(__FILE__,__LINE__,__FUNCTION__,p)
#else
#define MALLOC(size) malloc(size)
#define FREE(p) free(p)
#endif//__MALLOC__
在需要调试的时候,#define __MALLOC__,并且把所有的malloc,free替换成MALLOC,FREE。不需要调试的时候不定义即可。
然后就能打印出每条malloc,free语句执行之后的结果,帮助我们确定哪里出了问题。
以上函数中 file 为日志文件的名字,line 为该条语句所在行数, function为该语句所在函数, size为需要malloc的大小,p为需要free的指针。
我的程序出现错误的原因是:
我采用动态计算长度的方法,比如url是在某个时间点之后才生成出来,但是忘记了把url长度也加到总长度里面。
malloc的空间不够,然后调用了sprintf 把大于该空间长度的字符串写入堆空间,越界访问堆空间,导致下一次malloc失败。
总结:
C的程序要对底层的东西比较熟悉才能写得好,像字符串操作,内存操作之类的一不小心就会导致内存泄漏或者逻辑错误。
推荐以下网址:
方便查询每个函数具体怎么用,有什么要注意的。另外在用函数之前,可以先测试一下功能,看看可能出现的异常。
http://www.tutorialspoint.com/c_standard_library/string_h.htm
写程序也不能着急,应该一开始理清楚思路再写。
调程序不能着急,慢慢一步步先找出问题在哪里,然后从头考虑整体逻辑是否正确。
google,baidu是利器。