函式中的指標分配的記憶體怎麼釋放

luckyone906發表於2017-05-11

被呼叫函式裡動態分配的記憶體要不要手動釋放 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版本衝突導致程式奔潰。

相關文章