C语言中怎样清空内存动态分配的堆空间

比如我定义了一指向个字符串数组的指针 char** A
其中每个成员都是一个字符串 char* S
我在这个数据结构上写了个排序算法
使用完毕后需要清空为A分配的所有内存,则需要for 1到A.length free(S)来清空所有S
问题出现了,清空所花费的时间比排序本身还长。
问下各位达人,有没有可以一次性清空所有对空间分配的内存的函数方法?

在C语言中,要在堆上分配空间,需要使用内存申请函数。一般用malloc。

void * malloc(int size);
可以申请一段长度为size字节的空间,并返回空间的首地址。
要清空分配的内存空间,也就是将该空间所有字节均赋值为0,可以使用memset函数。
该函数声明与string.h中,形式为
void memset(void *start, int value, int size);
如果要清空空间的首地址为p,大小为len,则可以调用
memset(p, 0, len);
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-21
如果你真要修改内存分配,自己控制的话,可以去查下资料
placement new。STL里面很多都这样用。本回答被提问者采纳
第2个回答  2011-10-21
你调用一次malloc() 就有相应的一个free()
这两个是配对使用了 如果它们俩的数目不对肯定会出错的
没有一次性清空所有的动态申请的内存的函数,
必须严格按照malloc 、free配对使用

清空所花费的时间比排序本身还长 估计是你代码本身有问题追问

代码应该是没问题的
清空的代码很简单:
for(i=0; i<S.length; i++) {
free(S.sp[i]);
}
free(S.sp);
注释掉以后就可以发现它占用了多少时间
S数组的长度是2的20次方
算法处理只需要几百秒,而清空远大于之。

追答

malloc呢??

追问

前面有malloc,问题肯定不是malloc
关于malloc和free配对的是基本常识。。我知道

C语言中怎样清空内存动态分配的堆空间
在C语言中,要在堆上分配空间,需要使用内存申请函数。一般用malloc。void * malloc(int size);可以申请一段长度为size字节的空间,并返回空间的首地址。要清空分配的内存空间,也就是将该空间所有字节均赋值为0,可以使用memset函数。该函数声明与string.h中,形式为 void memset(void *start, int va...

c语言程序运行完后 还占用内存空间么?怎么删
程序运行完之后,即使内存没有在程序中被正确释放也会被操作系统回收的。当然了,不释放动态内存是一种不好的习惯,当你的程序变大时副作用就会很明显。

C语言 malloc()函数 分配内存空间尺寸的问题
分配的空间要能保证容下你想存储的数据,不要和机器逗着玩(分配0空间,或少于自己实际需要的空间),如你上面的操作,表面上你程序运行没有问题,可实际上你占用了别人的地盘,只是当前你很幸运没有使程序出现问题,但不保证一定不出问题!!不再使用的指针,一定要free()来释放空间!malloc 与free要...

C语言:怎么销毁数组呢?
1、如果是局部函数栈空间中的数组,有程序自动回收。void f(){int a[2] = {1,2}; \/\/局部栈空间上的数组,程序自动回收}2、如果是动态内存分配 的数组,在c语言中使用free()将其释放。回收有操作系统的堆管理器来进行操作。void f(){int *p = (int *) malloc(2 * sizeof(int));free(...

c++中new和delete的用法
在C++编程中,使用new分配的数组可用delete释放。这里释放的是动态分配的数组空间,而不是静态分配的数组空间,详细步骤:1、例如,我们动态创建了一个一维int数组arr,现在需要将它释放。2、这时只需要使用delete[]数组名即可。3、注意,要释放数组所占的内存,[]不能少。否则,用delete则不能完全释放...

C语言中使用malloc分配内存后没有回收,有办法解决么?
用调试器跟踪示例 7-5,发现指针 p 被 free 以后其地址仍然不变(非 NULL) ,只是 该地址对应的内存是垃圾,p 成了“野指针” 。如果此时不把 p 设置为 NULL,会让人误 以为 p 是个合法的指针。如果程序比较长,我们有时记不住 p 所指的内存是否已经被释放,在继续使用 p 之 前,通常会...

C语言动态和静态存储类别的区别
静态存储就是在程序开始的时候就分配固定的内存单元,整个程序结束后释放存储单元,而动态存储单元在程序运行初不分配内存单元在用到时才分配,而当用过后则立刻释放该内存空间

程序中动态分配的内存存放在哪个区域
程序中动态分配的内存存放在堆内存区域。叫“堆”。c语言:char *p1; \/\/若是全局量,则在全局未初始化区,若是局部量,则在栈中。p1 = (char *)malloc(10); \/\/分配得来得10字节的区域在堆区。c++语言: 用 new分配,用 delete释放,在 堆区。用malloc分配,用 free释放,在类似堆区的自由...

c语言中讲到,软件在内存条中运行完毕后所遗留下的残留数据,就是垃圾...
没有修改内存空间的功能,也就无法清除掉垃圾数据 C语言程序中的变量被定义时,系统随机为其分配一个空间,这时,这个空间可能被之前的某些程序使用过,因此遗留下了垃圾数据,由于系统不对这些垃圾数据做处理,所以这个变量在没有被赋值之前的值是随机的,所以会自动输出一堆随机的值 ...

C语言-动态分配内存 malloc & free
(1) 如果设一个太大的数组,则显得浪费内存 (2) 如果设得太小,又怕不够 问题:如何做到恰好够用、又一点不浪费呢?系统中存在一个内存管理器(MM, Memory Manager),它负责管理一堆闲置内存。它被设计用于解决此类问题。MM提供的服务:应用程序可以向MM申请(借出)一块指定大小的内存,用完之后...

相似回答