文章目录
1.动态内存分配
- 使用
malloc
类的函数分配内存 - 使用分配的内存来支持应用程序
free
函数释放内存
如下,分配内存并为内存中填充数据:
int* p = (int*)malloc(sizeof(int));
*p = 990715; //为开辟的内存填充数据
free(p); //释放开辟的内存
其中malloc
函数的参数指定分配内存的字节数。分配成功,返回从堆上分配的内存的地址;分配失败,返回空。sizeof
操作符使得程序具有更好的移植性,因为不同的机器系统可能对不同的数据类型有不同的字节分配数,所以使用该操作符可以在不同的系统上得到正确的字节数。
注意: 每次调用malloc
等类似函数时,程序结束时要调用free
函数释放内存,防止出现内存泄漏。
一旦被free
之后,就不能再次解引去访问其值。通常我们会将释放的指针赋值为NULL
.
1.1. 内存泄漏
未将不再使用的内存空间释放就可能发生内存泄漏。通常引起内存泄漏的原因有如下:
- 丢失内存地址
- 未调用
free
函数释放(隐式泄漏)
什么是内存泄漏:
内存泄漏的一个问题就是无法回收内存并加以重复利用,堆管理器可用内存越来越少。内存被不断的分配并丢失。当需要更多的内存malloc
而又不能分配时程序可能就会终止,因为内存耗尽。严重时,会导致系统崩溃。
如下的例子:
char *ch;
while(true){
ch = (char*)malloc(1000000);
cout << "FEEL" << endl;
}
其中ch
变量是指向堆上分配的内存,但是,在下一次的循环之前,即指向另一块新的内存之前没有释放当前指向的内存,如下下去,程序会将内存耗尽而中断,即使没有中断,可利用的内存也将会极大的降低。
1.1.1 丢失地址
int *p = (int*)malloc(sizeof(int)); //开辟内存
*p = 1999;
p = (int*)malloc(sizeof(int)); //将指向堆内存的指针指向另一块内存空间
这样的话,没有释放第一次所开辟的内存空间,就指向了新开辟的内存空间,就会导致第一次所分配的空间的地址丢失,造成无法引用,释放,形成内存泄漏。
另一种例子如下:
char* name = (char*)malloc(strlen("FEEL") + 1);
strcpy(name,"FEEL"); //为分配的内存空间赋值
while(*name != 0){
//逐个输出每个字符
printf("%c",*name);
name++;
}
上述几行代码,在每一次的循环当中,name都会加1,