C++ Primer中文版(第三版)中的动态内存分配问题

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

9 个解决方案

#1


问题一:在函数里面定义的指针,如果不是静态变量,那么它的生命周期就只到函数返回的时候结束。
问题二、它和任何一个其他的非动态分配的变量一样,自行死亡,不需要你来管理。你只要管好你自己分配就就好了。

#2


是啊 ,你都说得很对啊,指针的空间是什么?你想想就知道了,我们怕的知只是内存的泄露!

#3


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

#4


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

#5


至于内存泄漏问题,我刚刚列出的两个函数,我本来是想用前者来避免内存泄漏,但结果是正是前者才造成内存泄漏,后者反而没有,所以百思不得其解。

#6


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

#7


搞清楚栈和堆的差别吧。

再看看new的实现方式和使用规范,就不会有问题了。

#8


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

#9


注意别用野指针,

delete[] p;

//然后,将指针指向一个合法的位置:

p = NULL;

#1


问题一:在函数里面定义的指针,如果不是静态变量,那么它的生命周期就只到函数返回的时候结束。
问题二、它和任何一个其他的非动态分配的变量一样,自行死亡,不需要你来管理。你只要管好你自己分配就就好了。

#2


是啊 ,你都说得很对啊,指针的空间是什么?你想想就知道了,我们怕的知只是内存的泄露!

#3


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

#4


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

#5


至于内存泄漏问题,我刚刚列出的两个函数,我本来是想用前者来避免内存泄漏,但结果是正是前者才造成内存泄漏,后者反而没有,所以百思不得其解。

#6


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

#7


搞清楚栈和堆的差别吧。

再看看new的实现方式和使用规范,就不会有问题了。

#8


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

#9


注意别用野指针,

delete[] p;

//然后,将指针指向一个合法的位置:

p = NULL;