函数中的指针分配的内存怎么释放


被调用函数里动态分配的内存要不要手动释放 20
我想手动释放来着,但是指针是在被调用函数里声明的,在调用函数里释放不了。
我的被调用函数返回的就是这个指针,我也不能在被调用函数里释放。

 

你指的“动态分配”是系统自动分配内存,如 char c[100];

还是手动分配的,如 char *p = (char *)malloc(100);

如果是第一种方式,则不需要手动释放。

第二种方式,释放时需要制定内存区域的指针,如free(p)。如果你在调用函数里手动分配了内存,那么需要将内存指针返回,然后再释放。


如 

1
2
3
4
5
6
7
8
9
10
char * proc1()
{
     char *p = ( char *) malloc (100);
     retrun p;
}
void proc2()
{
     char *p = proc1();    //调用 proc1
     free (p);
}

其他

都看糊涂了,你的意思是如下代码吗?
int* Func2(void)
{
int *p = new int(0);

return p;

}

void Func(void)
{
int *p = Func();

delete p;

p = NULL;

}

如果是如上代码,不可能释放不了,堆是属于整个进程的,在堆中申请的内存在任何地方都可以释放.

我看的是C

被调用函数里的变量不是本地变量吗,它在函数结束时是不是自动删除的。而不用手动释放。

首先,被调用函数里的变量是在线程栈中分配的,在离开作用域里自动回收这是没错的.但这里的自动变量是指针P,而不是指针所指向的内存,这里是有区别的,指针P所占用的内存当然会自动回收,但指针所指的内存是由malloc分配的,这是在进程的默认堆里分配的,必须用free回收(不过就算没调用free程序结束时也会由操作系统回收).
从你发出的代码来看是完全没有问题的,不知道你说的不能释放是什么意思. 
如果你的主调函数在一个dll或者exe中,被掉函数在另外的dll或者exe中, 只有CRT的版本一样,你才能delete或者free,要不然可能挂掉。
如果在一个exe或者dll中,你当然可以释放。既然你想释放的指针是那个函数里声明的,想必也是那个函数里new的,这样就更加安全了。
如果你在不同的dll或者exe中互相传指针,那么要本着这样一个原则:谁new的谁delete,提供指针的地方也需要提供一个release函数用于释放指针,这样就不会因为CRT版本冲突导致程序奔溃。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值