何时/如何释放从函数返回的指针

时间:2012-06-05 23:35:39

标签: c debugging pointers free

我有这个功能:

char * folderFromPath(char *path)
{
  printf("\nentered folderFromPath\n");

  char *token[80];
  int i = 0;  
  const int STR_LEN = 128;
  char str[STR_LEN];
  char *folder;
  folder = malloc(sizeof(path));
  strcpy(folder,"/");

  if (strlen(path) > STR_LEN)
  {
    printf("Warning: strlen(path) > STR_LEN, (%d > %d) in function folderFromPath\n", strlen(path), STR_LEN);
  }
  else
  {
      printf("path: %s\n", path);

    strcpy(str,path);

    token[0] = strtok(str, "/");

    while (token[i]!= NULL)
    {
      i++;
      token[i] = strtok (NULL, "/");
      printf("token[i]: %s, i: %d\n", token[i], i);
    }

    if (folder != NULL)
    {
        int j = 0;
        while (j < (i-1))
        {
              strcat(folder,token[j]);
              strcat(folder,"/");
            j++;
        }

        printf("folder: %s\n", folder);

    }

  } /* else if (strlen(path) < STR_LEN) */

  return folder;

}

在其中,您可以看到我已动态分配folder指向的内存。您还可以看到该文件夹​​返回到调用函数。我看到in this post建议在调用函数中使用指针后释放指针。这就是我所做的。这是调用函数:

void open_activated(GtkWidget *widget, GtkWindow *parent)
{
  GtkSourceLanguage *lang;
  GtkSourceLanguageManager *lm;
  GtkWidget *dialog;
  GtkWidget *tablabel;
  GtkTextBuffer *tbuffer;
  int openTabs = 0;
  char *folder1;
  const gchar *folder2;
  int page = 0;
  char *path;

  page = gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook));
  path  = paths[notebookPages[page]];
  folder1 = folderFromPath(path);
  folder2 = folder1;

  dialog = gtk_file_chooser_dialog_new("Open File", parent, GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL);
  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog), folder2);
  free(folder1); 

  tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txtinput[openedPages]));

  gtk_source_buffer_begin_not_undoable_action(GTK_SOURCE_BUFFER(tbuffer));

  if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_ACCEPT)
  {

    ...

  } /* if(gtk_dialog_run(GTK_DIALOG(dialog))== GTK_RESPONSE_ACCEPT) */

  gtk_widget_destroy(dialog);
  changeLabelColor("black");
  gtk_text_buffer_set_modified (gtk_text_view_get_buffer((GTK_TEXT_VIEW(txtinput[openedPages]))), FALSE);

  gtk_source_buffer_end_not_undoable_action(GTK_SOURCE_BUFFER(tbuffer));
  write_config_files();

  verifyPaths();  

}

当我尝试打开文件时,应用程序将中止并生成以下语句:

*** glibc detected *** ./ledit: free(): invalid next size (fast): 0x082a80c8 ***

所以我的问题是这个错误意味着什么,我该怎么做才能正确释放指针?感谢。

1 个答案:

答案 0 :(得分:2)

主要问题可能是这个。

char * folderFromPath(char *path)
...
folder = malloc(sizeof(path));

您正在分配sizeof(path),与sizeof(char*)相同,因为pathchar*。您只需要分配足够的字节来容纳单个指针,而不是整个路径,这可能与您的意图相同。

尝试改为:

folder = malloc(strlen(path)+1);

可能还有其他问题;我没有仔细观察。在将folder传递给gtk_file_chooser_set_current_folder()之后,看起来好像正确地释放了回复folder2,尽管我也不知道为什么要将其分配给strncpy()。如果你期望复制字符串的赋值(GTK函数是否期望获取路径的所有权?)那么你会感到失望;你必须使用{{1}}或类似的东西单独复制字符串。