老生常谈:一个关于C++指针猜想的验证

Posted on 2009-09-06 10:41  一有新人  阅读(439)  评论(4编辑  收藏  举报
。。。让我们先看一段程序:
Code

以上程序的初衷是利用函数f()分配空间并初始化为"HelloWorld"。这句printf("%s\n", s);会输出什么呢?
(null)
这是在我机子上的输出。难道空间没有分配成功?为了验证,我又修改程序如下:
Code

结构输出:
0
(null)
说明的确没有分配成功。那又是什么原因呢?莫非函数f()中的这句p = new char[100];执行后没有分配空间吗?我又修改程序如下:
Code
输出为:

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的空间)在内存中还是存在的,只是我们不知道它在哪里。
结合最近做项目的感想,写程序时最好不要在函数内分配空间而在函数外释放,最理想是在哪一级分配,就在哪一级释放。否则内存泄露就如家常便饭了。


Copyright © 2024 一有新人
Powered by .NET 8.0 on Kubernetes