1.free
C++ 中的free() 函数释放先前使用 calloc、malloc 或 realloc 函数分配的内存块,使其可用于进一步分配。
free() 函数不会改变指针的值,即它仍然指向同一个内存位置。
该函数在<cstdlib> 头文件中定义。
参数:
ptr
: 指向先前使用 malloc、calloc 或 realloc 分配的内存块的指针。指针可能为空,也可能不指向由 calloc、malloc 或 realloc 函数分配的内存块。- 如果 ptr 为空,free() 函数什么也不做。
- 如果 ptr 不指向由 calloc、malloc 或 realloc 函数分配的内存块,则会导致未定义的行为。
2.malloc
中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。
头文件:
#include<malloc.h>或者#include<alloc.h>两者的内容是完全一样的
2、malloc和new
new返回指定类型的指针,并且可以自动计算所需要的大小。
int *p;
p = new int;//返回类型为int* ,分配的大小是sizeof(int)
p = new int[100];//返回类型是int*类型,分配的大小为sizeof(int)*100
而malloc需要我们自己计算字节数,并且返回的时候要强转成指定类型的指针。
int *p;
p = (int *)malloc(sizeof(int));
(1)malloc的返回是void*,如果我们写成了:p=malloc(sizeof(int));间接的说明了(将void转化给了int*,这不合理)
(2)malloc的实参是sizeof(int),用于指明一个整型数据需要的大小,如果我们写成p=(int*)malloc(1),那么可以看出:只是申请了一个一个字节大小的空间。
(3)malloc只管分配内存,并不能对其进行初始化,所以得到的一片新内存中,其值将是随机的。一般意义上:我们习惯性的将其初始化为NULL,当然也可以使用memset函数。
3.示例
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
int *ptr;
ptr = (int*) malloc(5*sizeof(int));
cout << "Enter 5 integers" << endl;
for (int i=0; i<5; i++)
{
// *(ptr+i) can be replaced by ptr[i]
cin >> *(ptr+i);
}
cout << endl << "User entered value"<< endl;
for (int i=0; i<5; i++)
{
cout << *(ptr+i) << " ";
}
free(ptr);
/* prints a garbage value after ptr is free */
cout << "Garbage Value" << endl;
for (int i=0; i<5; i++)
{
cout << *(ptr+i) << " ";
}
return 0;
}