要知道什么是内存的动态分配,首先要清楚内存在计算机中内存是如何划分的:
如图,内存区域大致分为以下几个区域:
栈区(向下增长)(stack):由编译器自动分配释放,存放:局部变量,形参,返回值....再比如我们创建一个数组,如:
int arr[10]={0};
这时数组内容仍然存储在栈区中,由编译器分配空间存储或销毁.
这样的内存使用方式有两个特点:
内存空间开辟大小是固定的....这样的特点就导致了,我们无法在程序运行中的任意时刻分配存储空间,也不能把不需要的存储空间释放或丢弃.为了能够满足上述需求,我们就需要使用内存的动态分配....因此,在使用动态内存开辟空间时,我们要格外小心不要出现越界访问的问题.
3.对非动态开辟内存使用free释放
因为p是由编译器分配到栈区的,不属于堆区,因此不能使用free释放.
void test...*)malloc(100);
p++;
free(p); //p不再指向动态内存的起始位置
}
在vs2022中测试一下:
可以看到,该错误导致了程序异常终止.
5.对同一块动态内存多次释放