关于内存管理的一个小问题

oralxc 2005-07-20 06:10:08
请问在局部函数申请的空间出了这个局部函数是不是不用释放就自己失效了?比如:

void test()
{
CDxag *a = new CDxag;
a->add(1);
.
.
.
// delete(a);
}

不要那个delete(a)到外面是不是自动失效了(像局部变量一样)?请高手指点哦~
讲详细点,说到实质~
如果不会自动失效那么我要在其他函数里释放他又该怎么做。
讲得越清楚分越多,弄明白即给分.
...全文
183 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
oralxc 2005-07-21
  • 打赏
  • 举报
回复
明白了,结分
aneird 2005-07-20
  • 打赏
  • 举报
回复
zengwujun(月之海 为linux入门奋斗100天) 写的比较正确,既然new了 没有delete 那就是肯定没有释放呢
AntonlioX 2005-07-20
  • 打赏
  • 举报
回复
up
zengwujun 2005-07-20
  • 打赏
  • 举报
回复
CDxag *test()
{
CDxag *a = new CDxag;
a->add(1);
.
.
.
return a;
// delete(a);
}

void main()
{
Cdxag *b = test();
delete b;
}
newbiestar 2005-07-20
  • 打赏
  • 举报
回复
a本身占用的空间会在函数结束的时候由一条栈指令释放掉,但是a指向的空间是要程序员显式调用delete释放的
handsomerun 2005-07-20
  • 打赏
  • 举报
回复
CDxag *a = new CDxag;
的时候,在内存中(堆)中会开辟一块空间,然后给你新建一个CDxag对象,然后把这个对象的地址赋值给a,然后你就可以通过这个指针a来操作那个对象,那个你在堆中的那个对象

等到你这个函数结束的时候,由于你这个指针是在栈中的变量,是局部变量,那么那个指针在函数结束的时候就被释放了,注意,是这个指针没有了,但是你内存中的这个CDxag对象还在啊,而且指向这个对象的指针没有了,你就没法操作内存中的这个CDxag对象了,然后内存就泄漏了

所以在返回之前,要先调用delete a,通过他,把那个CDxag对象释放掉,把这个对象结束掉,这样就没问题了

nelsonc 2005-07-20
  • 打赏
  • 举报
回复
你这样写,退出时a不会释放。
皮皮鲁 2005-07-20
  • 打赏
  • 举报
回复
在函数中,如果是从栈中申请内存,那么在函数返回,变量会自己清楚
但是如果在堆中申请内容(你提到的CDxag *a = new CDxag;即是从堆中申请内容),那么函数返回时并不会释放

你最好在函数中就将之释放(用delete a即可),如果你想在另外的函数中使用到这个堆中的数据的话否则,你必须将申请到的指针传出来,然后调用delete释放,
JonneyR 2005-07-20
  • 打赏
  • 举报
回复
up...

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧