在C++ Primer中文版(第三版)中的第340页,讲到指针pi的生命期和pi指向的对象的生命期之间的区别。它说指针pi本身是个全局域中声明的全局变量,pi得储存区在程序开始之前就被分配。且一直保存到程序结束。而pi指向的对象是在程序执行过程中遇到new才创建,在程序运行期间遇到delete表达式pi指向的内存就会被释放。
问题一:即使我在函数里面定义的指针,它也是全局变量,并且在程序开始前就被分配?
问题二:我对指针用表达式delete,也只能释放指针指向对象的内存空间,而不是指针本身,指针的空间要等到程序结束后才释放?
本人白思不得其解,望高手之点一二!

解决方案 »

  1.   

    我一向都是这样认为,直到我做了一个项目,其中有一个函数
    OnDraw()
    {
     double *p=new doubel[4*4];
     ......
     ......
     delete[] p;
    }
    后来发现程序运行的时候,就是反复调用OnDraw()函数的时候,内存泄漏的很厉害,后来我把程序改为
    OnDraw()
    {
     double p[4*4];
     ......
     ......
    }
    反而没有出现内存泄漏的情况。
    后来看到C++ Primer中文版(第三版)中动态内存分配的时候,才产生以上疑问。
      

  2.   

    to volheart:你说的:“你都说得很对啊”是指谁啊?
    指针的空间是指指针也是一个对象,它也占内存空间
      

  3.   

    不会呀,你的代码不会有内存泄露现象,我调试过了,是不是你的代码不是这样的。
    double p[4*4];这种定义当然不会有内存泄露,它只是栈中的一个临时变量,函数的栈操作会自动回收它的空间。
      

  4.   

    搞清楚栈和堆的差别吧。再看看new的实现方式和使用规范,就不会有问题了。
      

  5.   

    double p[4*4]; 在栈里面分配,函数执行完毕就释放,当然没问题。
    如果你说 delete[] p 不行,就说不过去了。
    又不是像java那样,只能在堆里面分配空间,最后依赖垃圾收集来处理,是不是还有别的原因(其它代码)?
      

  6.   

    注意别用野指针,delete[] p;//然后,将指针指向一个合法的位置:p = NULL;