簡體   English   中英

釋放指針的函數不起作用

[英]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的值時,您分配的是pointer1pointer2等的當前值,而不是“此處使用指針的一些重要代碼”運行時它們可能包含的任何值。

將指針值傳遞給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是空指針,則不會發生任何操作。 否則,如果參數與之前由內存管理函數返回的指針不匹配,或者如果空間已通過調用freerealloc釋放,則行為未定義。

你需要要么

  • 將其設置為NULLnull-pointer常量)
  • 首先使用malloc()或 family 分配free內存。

也就是說, pointer2pointer3pointer4在您的代碼中未聲明,但這可能是一個錯字,因此我們可以忽略它。

為了釋放一個指針,你必須首先為它分配內存。 您將釋放從未分配過的指針。 嘗試以下代碼以了解您做錯了什么

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.

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