问题一:即使我在函数里面定义的指针,它也是全局变量,并且在程序开始前就被分配?
问题二:我对指针用表达式delete,也只能释放指针指向对象的内存空间,而不是指针本身,指针的空间要等到程序结束后才释放?
本人白思不得其解,望高手之点一二!
9 个解决方案
#1
问题一:在函数里面定义的指针,如果不是静态变量,那么它的生命周期就只到函数返回的时候结束。
问题二、它和任何一个其他的非动态分配的变量一样,自行死亡,不需要你来管理。你只要管好你自己分配就就好了。
问题二、它和任何一个其他的非动态分配的变量一样,自行死亡,不需要你来管理。你只要管好你自己分配就就好了。
#2
是啊 ,你都说得很对啊,指针的空间是什么?你想想就知道了,我们怕的知只是内存的泄露!
#3
我一向都是这样认为,直到我做了一个项目,其中有一个函数
OnDraw()
{
double *p=new doubel[4*4];
......
......
delete[] p;
}
后来发现程序运行的时候,就是反复调用OnDraw()函数的时候,内存泄漏的很厉害,后来我把程序改为
OnDraw()
{
double p[4*4];
......
......
}
反而没有出现内存泄漏的情况。
后来看到C++ Primer中文版(第三版)中动态内存分配的时候,才产生以上疑问。
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];这种定义当然不会有内存泄露,它只是栈中的一个临时变量,函数的栈操作会自动回收它的空间。
double p[4*4];这种定义当然不会有内存泄露,它只是栈中的一个临时变量,函数的栈操作会自动回收它的空间。
#7
搞清楚栈和堆的差别吧。
再看看new的实现方式和使用规范,就不会有问题了。
再看看new的实现方式和使用规范,就不会有问题了。
#8
double p[4*4]; 在栈里面分配,函数执行完毕就释放,当然没问题。
如果你说 delete[] p 不行,就说不过去了。
又不是像java那样,只能在堆里面分配空间,最后依赖垃圾收集来处理,是不是还有别的原因(其它代码)?
如果你说 delete[] p 不行,就说不过去了。
又不是像java那样,只能在堆里面分配空间,最后依赖垃圾收集来处理,是不是还有别的原因(其它代码)?
#9
注意别用野指针,
delete[] p;
//然后,将指针指向一个合法的位置:
p = NULL;
delete[] p;
//然后,将指针指向一个合法的位置:
p = NULL;
#1
问题一:在函数里面定义的指针,如果不是静态变量,那么它的生命周期就只到函数返回的时候结束。
问题二、它和任何一个其他的非动态分配的变量一样,自行死亡,不需要你来管理。你只要管好你自己分配就就好了。
问题二、它和任何一个其他的非动态分配的变量一样,自行死亡,不需要你来管理。你只要管好你自己分配就就好了。
#2
是啊 ,你都说得很对啊,指针的空间是什么?你想想就知道了,我们怕的知只是内存的泄露!
#3
我一向都是这样认为,直到我做了一个项目,其中有一个函数
OnDraw()
{
double *p=new doubel[4*4];
......
......
delete[] p;
}
后来发现程序运行的时候,就是反复调用OnDraw()函数的时候,内存泄漏的很厉害,后来我把程序改为
OnDraw()
{
double p[4*4];
......
......
}
反而没有出现内存泄漏的情况。
后来看到C++ Primer中文版(第三版)中动态内存分配的时候,才产生以上疑问。
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];这种定义当然不会有内存泄露,它只是栈中的一个临时变量,函数的栈操作会自动回收它的空间。
double p[4*4];这种定义当然不会有内存泄露,它只是栈中的一个临时变量,函数的栈操作会自动回收它的空间。
#7
搞清楚栈和堆的差别吧。
再看看new的实现方式和使用规范,就不会有问题了。
再看看new的实现方式和使用规范,就不会有问题了。
#8
double p[4*4]; 在栈里面分配,函数执行完毕就释放,当然没问题。
如果你说 delete[] p 不行,就说不过去了。
又不是像java那样,只能在堆里面分配空间,最后依赖垃圾收集来处理,是不是还有别的原因(其它代码)?
如果你说 delete[] p 不行,就说不过去了。
又不是像java那样,只能在堆里面分配空间,最后依赖垃圾收集来处理,是不是还有别的原因(其它代码)?
#9
注意别用野指针,
delete[] p;
//然后,将指针指向一个合法的位置:
p = NULL;
delete[] p;
//然后,将指针指向一个合法的位置:
p = NULL;