转载地址:http://www.cnblogs.com/yyxr/archive/2009/09/06/1561197.html
。。。让我们先看一段程序:
#include <stdio.h> #include <stdlib.h> #include <string> void f(char *p) { p = new char[100]; strcpy(p, "Hello"); strcat(p, "World!"); } int main(void) { char *s = NULL; f(s); printf("%s\n", s); delete []s; return 0; }
以上程序的初衷是利用函数f()分配空间并初始化为"HelloWorld"。这句printf("%s\n", s);会输出什么呢?
(null)
这是在我机子上的输出。难道空间没有分配成功?为了验证,我又修改程序如下:
#include <stdio.h> #include <stdlib.h> #include <string> void f(char *p) { p = new char[100]; strcpy(p, "Hello"); strcat(p, "World!"); } int main(void) { char *s = NULL; f(s); printf("%d\n", s); //打印出指针地址 printf("%s\n", s); delete []s; return 0; }
结果输出:
0
(null)
说明的确没有分配成功。那又是什么原因呢?莫非函数f()中的这句p = new char[100];执行后没有分配空间吗?
我又修改程序如下:
#include <stdio.h> #include <stdlib.h> #include <string> void f(char *p) { printf("%d\n", p); //打印出指针地址 p = new char[100]; //问题出现在这里,new之后,p指向另一块内存,但是a并不改变 printf("%d\n", p); //打印出指针地址 strcpy(p, "Hello"); strcat(p, "World!"); printf("%s\n", p); } int main(void) { char *s = NULL; f(s); printf("%d\n", s); //打印出指针地址 printf("%s\n", s); delete []s; return 0; }
输出为:
0
9965312
HelloWorld!
0
(null)
Press any key to continue
第一个0说明传入函数是指针地址为NULL,9965312和HelloWorld!则说明在函数f()中成功的给形参p分配了空间并初始化了。第2个0说明调用函数f()后的确没有给s分配空间。
综上所述,我得出的结论是:当函数参数为指针时,在函数中修改该指针所指向的地址(如上面得p)实际上只是修改了形参(p)的值,而实际的指针(如上的s)所指向的地址是不变的。
当然,以上程序还有内存泄露的BUG,“delete []s;”这句根本就销毁不了在函数f()中分配的空间。“HelloWorld”(即函数f申请的100的空间)在内存中还是存在的,只是我们不知道它在哪里。
结合最近做项目的感想,写程序时最好不要在函数内分配空间而在函数外释放,最理想是在哪一级分配,就在哪一级释放。否则内存泄露就如家常便饭了。