函数特性
1.开辟成功,返回一个指向该空间的指针。
2.开辟失败,返回一个NULL指针,因此calloc的返回值一定要做检查。
3.返回值的类型是void✳,calloc函数并不知道开辟空间的数据类型,具体在使用的时候由使用者自己决定。
4.calloc会在返回地址之前把申请的空间每个字节都初始化为0(calloc适用于对申请空间的内容要求初始化的情况)
注意:对申请的空间初始化并不完全是好的事情,当我们要申请一个特别大的空间时,初始化会浪费很多很多的时间。
2.3 realloc
函数功能
void✳ realloc(void✳ ptr要调整的内存地址,size_t size调整之后的空间大小)
举个栗子:int* p = NULL; p = realloc(ptr,1000); if(p!=NULL)-> ptr = p;
realloc可以对动态开辟的内存空间大小进行灵活调整。
函数特性
1.返回值为调整之后内存空间的起始位置。
2.realloc在调整原内存空间大小的基础上,还会将原内存空间中的数据移动到新的空间。
realloc在调整内存空间时存在的两种情况
情况一:原有空间之后有足够大的空间
直接在原有内存空间之后追加空间,原来空间的数据不发生变化
情况二:原有空间之后没有足够大的空间
在堆空间上重新找一块合适大小的连续空间来使用,这样函数返回的是一个新的内存地址。
常见的动态内存错误
1、对NULL指针的解引用操作。
2、对动态开辟空间越界访问。
3、对非动态内存使用free释放。
4、释放一块动态开辟内存的一部分。
5、对同一块内存多次释放。
6、动态开辟内存忘记释放。
以上的错误都是十分常见的,因此我们在对内存进行操作的时候一定要万分小心。
典型内存泄漏的例子
int main(){
int* p = (int*)malloc(sizeof(int));
p = (int*)malloc(sizeof(int));
free(p);
p = NULL;
}
这个例子中我们明明进行了释放却也造成了内存泄漏,这是因为我们申请了两次内存空间,但是用同一个指针来接收,只释放了一次,因此造成了内存的泄漏。
进行动态的内存分配后一定不能忘记在使用完毕后将内存空间释放,并且将指针赋值为NULL,这一点是十分关键的,否则将造成内存泄漏和野指针,对程序造成很大的影响。
三:C++中的内存管理方式
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理
在C++中我们使用new进行内存的申请,用delete进行内存的释放。










