free()以及malloc()用法

realloc,malloc,calloc的区别
三个函数的申明分别是: 
void* realloc(void* ptr, unsigned newsize); 
void* malloc(unsigned size); 
void* calloc(size_t numElements, size_t sizeOfElement); 
都在stdlib.h函数库内
它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL 
 
malloc用于申请一段新的地址,参数size为需要内存空间的长度,(分配指定字节数的存储区,初始值不确定)

如: 
char* p; 
p=(char*)malloc(20);
calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,(为指定数量指定长度的对象分配存储空间,空间中每一位(bit)都初始化为0)如: 
char* p; 
p=(char*)calloc(20,sizeof(char)); 
这个例子与上一个效果相同
realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度                        (增加或减少以前分配区的长度,当增加长度时,可能需要将以前分配区的内容移到另一个足够大的区域,以便在尾端提供增加的存储区,而新增区域的初始值是不确定的)
如: 
char* p; 
p=(char*)malloc(sizeof(char)*20); 
p=(char*)realloc(p,sizeof(char)*40);
注意,这里的空间长度都是以字节为单位。 
 
C语言的标准内存分配函数:malloc,calloc,realloc,free等。 
malloc与calloc的区别为1块与n块的区别: 
malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 
calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 
realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。 
 
 
free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。 被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。

注意:连续两次使用free函数,肯定会发生错误。malloc的次数要和free的次数相等。

C++中为new/delete函数。

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空
str = NULL;
即本程序已经放弃再使用他。
何谓“野指针”,在这里补充一下。


野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。


造成“野指针”的原因主要有
1.指针变量没有初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。在初始化的时候要么指向合法的指针,要么指向NULL。
2.指针变量被free或delete之后,没有设置为NULL。它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。上文DEMO则是这种情况。
3.指针操作超越了变量的作用范围。  注意其生命周期。

你可能感兴趣的:(C++)