0

以下の関数は基本的にエミュレートmkdir -pし、指定されたパスのディレクトリを再帰的に作成します。Linuxでは問題はありませんが、OSXで実行すると、pointer being freed was not allocatedへの呼び出し中に常にエラーが発生しfree(dir)ます。誰かがエラーを見つけることができますか?gdbで実行をステップスルーすると、明らかな問題は見られず、dirデータが入力され、ディレクトリ構造がエラーなしで作成されます。

static int
mkpath(const char *path)
{
  int result = 0;
  struct stat st;
  char *p = NULL, *dir = strdup(path);
  char *tmp = g_malloc0(sizeof(char) * strlen(cache.path) + strlen(dir) + 1);

  dir = dirname(dir);
  tmp = strcpy(tmp, cache.path);
  p = strtok(dir, "/");
  while(p != NULL) {
    tmp = strncat(tmp, "/", 1);
    tmp = strncat(tmp, p, strlen(p));

    if(stat(tmp, &st) == 0) {
      if(S_ISDIR(st.st_mode)) {
        p = strtok(NULL, "/");
        continue;
      }

      result = -ENOTDIR;
      break;
    }

    if(mkdir(tmp, S_IRWXU) == -1) {
      result = -errno;
      break;
    }

    p = strtok(NULL, "/");
  }

  free(tmp);
  free(dir);

  return result;
}
4

3 に答える 3

3

dirnameのマニュアルページを見てください:http://linux.die.net/man/3/dirname。"dirname()とbasename()はどちらも、nullで終了する文字列へのポインタを返します。(これらのポインタをfree(3)に渡さないでください。)"また、dir = dirname(dir)を実行してはいけません。 strdupによって割り当てられたメモリへのポインタを失いました(strdupに割り当てられたメモリをfreeに渡す必要があります)。

于 2011-12-23T01:26:40.440 に答える
1

マニュアルページにdirnameは、戻り値をに渡してはならないと書かれていますfree()。しかし、それはまさにあなたがしていることです。

于 2011-12-23T01:26:54.090 に答える
1

マニュアルページによると:

警告dirname()関数は、後続の呼び出しによって上書きされる内部静的ストレージスペースへのポインターを返します(各関数には独自の個別のストレージがあります)。

だからあなたはおそらくそれを解放したくないでしょう。Linuxでは違うと思いますか?

于 2011-12-23T01:28:08.100 に答える