目录
一、内存使用方式
(一)一个c/c++编译的程序占用的内存分为以下几个部分
二、malloc
(一)malloc
1. 举例:malloc(4)
2. 如何理解malloc(size(Var_T)*N)
3. 举例
(二)静态、全局指针和malloc
二、free
(一)free释放内存前后
(二)将已经释放的值赋值NULL
(四)常见的动态内存错误
1. 对NULL指针的解引用操作
2. 对动态开辟空间的越界访问
3. 对非动态开辟内存使用free释放
4. 使用free释放一块动态开辟内存的一部分
5. 对同一块动态内存多次释放
6. 动态开辟内存忘记释放(内存泄漏)
三、calloc
(一)calloc
(二)用memset和malloc 实现calloc一样的功能
1. memset
2. 举例
四、realloc
(一)realloc在调整内存空间的是存在两种情况
1. 原有空间之后有足够大的空间
2. 原有空间之后没有足够大的空间
(1)malloc()函数会返回一个void*类型的值,也就是分配出来的那块内存的第一个字节编号,也就是那块内存的首地址,通过首地址对那块内存进行访问
(2)void* p=malloc(4);
p指向那块内存的首地址,但是在利用*p定位内存的时候,由于变量p的返回类型是void*,定位出来的内存没有办法知道是什么变量类型,也就不知道大小等信息,因此malloc返回的值需要强制转换成一个有意义的变量类型。
例如:
int *p=(int*)malloc(4)
如:int a[10];
(1)变量a对应10个连续int组成的内存块,这块内存的表示值类型是int*
int*p=a;
(2)malloc(sizeof(int)*10)申请10个连续int的空间
解释为:申请一个int[10]空间,则该空间表示值类型应该为int*
int *p=(int*)malloc(sizeof(int)*10);
#include
#include
using namespace std;
int main()
{
int* ptr = NULL;
ptr = (int*)malloc(5 * sizeof(int));
if (ptr != NULL)//判断ptr指针是否为空
{
int i = 0;
for (i = 0; i < 5; i++)
{
*(ptr + i) = 0;
}
}
free(ptr);//释放ptr所指向的动态内存
ptr = NULL;
return 0;
}
static int* pi = malloc(sizeof(int));//会产生错误信息,对于全局变量也一样
static int* pi;
pi = malloc(sizeof(int));
//举例
#include
#include
using namespace std;
int main()
{
int* p = (int*)malloc(sizeof(int));
if (p == NULL)
exit(-1);
*p = 20;
cout << &p << " " << p << endl;//000000C61DDAFAD8 000002B2956376C0
free(p);
cout << &p << " " << p;//000000C61DDAFAD8 000002B2956376C0
return 0;
}
int* p = (int*)malloc(sizeof(int));
free(p);
p = NULL;
void test()
{
int *p = (int *)malloc(INT_MAX/4);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
void test()
{
int i = 0;
int *p = (int *)malloc(10*sizeof(int));
if(NULL == p)
{
exit(EXIT_FAILURE);
}
for(i=0; i<=10; i++)
{
*(p+i) = i;//当i是10的时候越界访问
}
free(p);
}
//错误举例:
int num;
int* p = &mun;
free(p);
void test()
{
int *p = (int *)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
}
int* p = (int*)malloc(sizeof(int));
int* p2 = p;
free(p);
.......
free(p2);
char* p;
while (1)
{
p = (char*)malloc(sizeof(char));
cout << endl;
}
#include
#include
#include
using namespace std;
int main()
{
int* p = (int*)calloc(10, sizeof(int));
assert(p != NULL);
free(p);
p = NULL;
return 0;
}
int* p = (int*)calloc(5, sizeof(int));
//等价形式
int* p = (int*)malloc(5 * sizeof(int));
memset(p, 0, sizeof(int));
#include
#include
#include
using namespace std;
int main()
{
int* p = (int*)malloc(40);
assert(p != NULL);
int* p2 = (int*)realloc(p, 40);
assert(p2 != NULL);
p = p2;
return 0;
}