[英]Function to free pointers not working
我正在學習 C 並試圖找出一種優雅的方法來在執行結束時釋放我的指針。
經過幾個小時的調試和使用以下代碼試驗不同的東西后,我無法弄清楚我做錯了什么:
int ClosePointers(char *pointersToClose[], int arraySize) {
int index;
for(index = 0; index < arraySize; index++) {
char *pointer = pointersToClose[index];
free(pointer);
}
return (0);
}
int main(int argc, char *argv[]) {
char *pointersToClose[4];
char *pointer1;
char *pointer2;
char *pointer3;
char *pointer4;
pointersToClose[0] = pointer1;
pointersToClose[1] = pointer2;
pointersToClose[2] = pointer3;
pointersToClose[3] = pointer4;
pointer1 = malloc(10);
pointer2 = malloc(10);
pointer3 = malloc(10);
pointer4 = malloc(10);
/*some important code here using the pointers*/
ClosePointers(pointersToClose, 4);
return 0;
}
我收到以下錯誤: * glibc 檢測 * /home/workspace/Debug/Test-POC: free(): invalid pointer: 0x00000038ce7b9850 ***
你能幫我指出我做錯了什么嗎?
您在這些指針上調用free
,但您從未使用malloc
為它們分配任何內存。 實際上,您嘗試free
的指針未初始化,因此它們可以包含任何內容。
當您設置pointersToClose
的值時,您分配的是pointer1
、 pointer2
等的當前值,而不是“此處使用指針的一些重要代碼”運行時它們可能包含的任何值。
將指針值傳遞給malloc
/ realloc
/ calloc
未返回的free
會導致未定義的行為。
如果你想這樣做,試着把每個有問題的指針的地址放在你的數組中。
int ClosePointers(char **pointersToClose[], int arraySize) {
int index;
for(index = 0; index < arraySize; index++) {
char **pointer = pointersToClose[index];
free(*pointer);
}
return (0);
}
int main(int argc, char *argv[]) {
char **pointersToClose[4];
char *pointer1;
char *pointer2;
char *pointer3;
char *pointer4;
pointersToClose[0] = &pointer1;
pointersToClose[1] = &pointer2;
pointersToClose[2] = &pointer3;
pointersToClose[3] = &pointer4;
/*some important code here using the pointers*/
ClosePointers(pointersToClose, 4);
return 0;
}
你能幫我指出我做錯了什么嗎?
您應該只在使用malloc()
函數在堆上分配的指針上使用free()
。
發生的情況是,在堆(保留的內存空間)中,分配給malloc()
函數的參數長度供您使用,並將地址返回到該內存空間的第一個字,因此可以分配給一個指針。
當您使用free()
,它會釋放該內存空間以便可以重用。
在這里,您創建了不指向任何內容的指針變量(實際上它們指向一個隨機值)。 因此,當您對這些變量調用free()
時發生的情況是您嘗試釋放一些不在托管空間內的隨機內存空間,稱為堆。 由於這些地址不太可能由malloc()
分配,因此free()
函數無法知道如何處理它,因此將返回錯誤!
繼續閱讀堆棧和堆是什么,以更好地理解它們是什么。 另外,請閱讀Kernighan 和 Ritchie 所著的C 編程語言書,其中解釋得很好。
在你的代碼中。 指針pointer1
被單元化。 它指向無效的內存。 將其傳遞給free()
調用未定義的行為。
引用C11
,第 7.22.3.3 章,(強調我的)
free
函數導致ptr
指向的空間被釋放,即可供進一步分配。 如果ptr
是空指針,則不會發生任何操作。 否則,如果參數與之前由內存管理函數返回的指針不匹配,或者如果空間已通過調用free
或realloc
釋放,則行為未定義。
你需要要么
NULL
( null-pointer
常量)malloc()
或 family 分配free
內存。 也就是說, pointer2
、 pointer3
和pointer4
在您的代碼中未聲明,但這可能是一個錯字,因此我們可以忽略它。
為了釋放一個指針,你必須首先為它分配內存。 您將釋放從未分配過的指針。 嘗試以下代碼以了解您做錯了什么
int AllocatePointers(char *pointersToClose[], int arraySize) {
int index;
for(index = 0; index < arraySize; index++) {
pointersToClose[index] = malloc(50*sizeof(char));
}
return (0);
}
int main(int argc, char *argv[]) {
char *pointersToClose[4];
char *pointer1;
char *pointer2;
char *pointer3;
char *pointer4;
pointersToClose[0] = pointer1;
pointersToClose[1] = pointer2;
pointersToClose[2] = pointer3;
pointersToClose[3] = pointer4;
AllocatePointers(pointersToClose, 4);
/*some important code here using the pointers*/
ClosePointers(pointersToClose, 4);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.