函数中的指针分配的内存怎么释放
生活随笔
收集整理的這篇文章主要介紹了
函数中的指针分配的内存怎么释放
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
被調用函數里動態分配的內存要不要手動釋放
20
我想手動釋放來著,但是指針是在被調用函數里聲明的,在調用函數里釋放不了。
我的被調用函數返回的就是這個指針,我也不能在被調用函數里釋放。
?
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版本沖突導致程序奔潰。
我的被調用函數返回的就是這個指針,我也不能在被調用函數里釋放。
?
你指的“動態分配”是系統自動分配內存,如?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版本沖突導致程序奔潰。
總結
以上是生活随笔為你收集整理的函数中的指针分配的内存怎么释放的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专访谷歌CEO:像对待家人一样对待员工
- 下一篇: Windows系统使用minGW+msy