簡體   English   中英

免費的函數指針數組

[英]Free array of function pointers

如果靜態分配了函數指針數組,我是否還需要free() 可以說我有以下代碼:

typedef void (*test_ptr)(void);

int main(void) 
{
    test_ptr test[3];
    test[0] = a;
    test[1] = b;
    test[2] = c;
}

因此,當我完成該操作后,是否需要釋放所有指針,也許像這樣:

for(int i = 0; i < 3; i++) {
    free(test[i]);
}

還是像其他數組一樣在函數結束時自動取消分配?

絕對不!

這樣分配的數組位於堆棧上,如果您嘗試使用free ,則free將會嚴重失敗。

順便說一句,您顯示的數組不是 “靜態”的。 我認為您的意思是“本地”,甚至“自動”(盡管可以與C ++概念混淆)。

除了沒有 2:在堆棧上分配意味着您不應以這種方式分配大數組 堆棧通常具有有限的容量,因此任何大的都應通過malloc分配。

因此,當我完成該操作后,是否必須釋放所有指針

不可以。因為只有當malloc系列函數中的任何一個指針先前返回了指針ptr時,才使用free(ptr)
free一個指向任何其他對象(如變量或數組元素)的指針會導致未定義的行為

C11:7.23.2.3的免費功能:

[...]如果ptr是空指針,則不會發生任何操作。 否則,如果參數與內存管理函數先前返回的指針不匹配,或者如果通過調用freerealloc釋放了空間,則該行為是undefined


還是像其他數組一樣在函數結束時自動取消分配?

是。 一旦其封閉函數返回,它將不再存在。

自動局部變量(如您所用的局部變量)將在創建它們的函數結束后立即銷毀。 就您而言,它們將在main()函數結束時被銷毀。

因此,您不必顯式地free()這些變量。

該代碼是否擁有指向對象的代碼,並且被分配了與freemalloc realloc calloc )相對應的分配函數之一?

如果是這樣,請在最后free它。

如果沒有,請停止。

您顯然在第二種情況下...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM