free.c是什么文件,进入之后,为什么出不来了
程序在一直在free.c文件中运行,出不来,怎么回事?程序里没有申请动态空间啊,不应该出现这种现象。我用得是map数据结构,处理100多M的数据。用小数据调试时,没有问题,大数据是一直出现问题,进入free.c文件出不来。
[解决办法]
单步调试看看呢?你把100M的数据都读到内存去了么??这样的话出问题是很正常的了。
[解决办法]
据我的经验,这样的问题一般是因为动态申请的内存越界了。你自己不申请,但是不能保证你调用的别的函数不申请。要调试这样的问题步骤很复杂:
1 重载内存申请函数
2 新内存申请函数的逻辑是:
多申请一定数量的内存,
2。1 记录申请者(文件名,行号),
2。2 在内存的开始和结束写一些特殊字节
3重载内存释放函数
新函数的逻辑是
检查内存申请时的字符是否被改写
如果被改写就找到申请者,报错。
如果能独立解决这样的问题,基本上c语言可以称作高手了。
努力!
[解决办法]
如果数据量比较大,而且每个节点(元素)的大小是固定的,建议自己定义1个内存池来实现,速度又快,内存的浪费也小。
设节点的数据类型是struct _node. 内存池的基本做法就是,首先分派一块大的内存,其长度len=sizeof(struct _node)*MAX_BLOCK,sizeof(struct _node)应该大于4个字节,和一个free_list的头指针head。起初,这个free_list包含MAX_BLOCK个节点,其head指针第一个块,第一块指向第二个,第MAX_BLOCK执行NULL。 free_list本生不占空间,因为free_list指向的节点是不使用的,共next指针和node的前4个字节共用。
这种做法只调用一次malloc,不需要频繁的调用系统的分配和释放函数,在自己的内存池中分配和释放一个节点的速度超快,内存的消耗也非常少,几乎没有辅助的开销(系统的malloc的开销很大,每分配一个节点都额外的空间,我之前的一个实验表明,每分配一个节点,其内存占用量为 sizeof(struct _node) 向上取16的倍数再加8字节。
关于内存池的实现的更多的信息,请参看侯捷对内存池的讨论http://ishare.iask.sina.com.cn/f/12367118.html。