C malloc free 调试 --- 解决堆被破坏错误

首先我们可以在程序中加入如下代码

#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是利器。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anyanyamy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值