上篇博文上我自己写了一个strcpy,只是简单的解决了标准库函数strcpy由于dest目的字符串大小不足以存储下需要复制的字符串而产生的越界问题, 在我的strcpy中dest的字符串大小是在函数里分配的,分配的大小根据需要复制的字符串大小而定,这样就不会产生越界问题了。
但我只考虑了分配内存给dest字符串,却未考虑释放自己分配给dest的内存。这里也就是在程序中动态的分配内存,需要自己释放分配的内存空间,不然要等到程序结束由系统来回收这些内存。有时程序结束之前我已经不需要使用这块内存了,这样就会造成内存不必要的浪费,如果不需要使用动态分配的内存了,我们应手动的释放它。
在程序运行时内存的分配方式:(代码段内存分配不做分析)
(1)静态存储区域分配。内存在程序编译的时候或者在操作系统初始化的时候就已经分配好,这块内存在程序的整个运行期间都存在,而且其大小不会改变,也不会被重新分配。例如全局变量,static变量等。
(2)栈上的内存分配。栈是系统数据结构,对于进程/线程是唯一的,它的分配与释放由操作系统来维护,不需要开发者来管理。
。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,不同的操作系统对栈都有一定的限制。
(3)堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。
所以应该为我写的 strcpy 添加一个释放内存的函数。代码如下:
int free_dest(char **p)
{
if(p == NULL) return -1;
free(*p);
*p = NULL;
return 0;
}
以上是我个人的理解,对内存分配的总结是我在网上摘录的,若有什么不足或不对的地方欢迎指出!