【问题标题】:Problem using free() function使用 free() 函数的问题
【发布时间】:2011-06-23 09:34:59
【问题描述】:

我有一个经常使用char *str[xx] 员工的C 程序。 一些字符串是使用赋值运算符(=)填充的,不需要被释放。 但是其他一些(在同一个数组中)使用strdup() 填充,需要在程序结束时释放:

char *str[10];

str[i]="你好";

str[k]=strdup("hi");

两个字符串指针都不为空,释放str[i]自然会产生“seg fault”。 我的问题是,在我的程序结束时,我不知道哪个指针指向由 strdup() 生成的字符串。你能帮我找到strdup生成的字符串以便我可以释放它们吗? 谢谢

【问题讨论】:

  • 程序结束时不需要释放 strdup() 内存。 exit() 时会自动释放内存。

标签: c linux free


【解决方案1】:

不幸的是,没有语言功能可以(可移植地)区分指向动态分配内存的指针和不指向动态分配内存的指针。您可以手动保留为其动态分配的索引列表。或者,如果性能不是一个大问题,则选择始终在堆上分配。

【讨论】:

  • +1 总是在堆上分配是最实用的解决方案
  • 或者,如果您的字符串长度受N 的限制,则一次性预分配N * xx + xx 字节并使用strncpy 进行分配。
【解决方案2】:

处理此问题的正确方法是通过malloc()strdup() 跟踪动态分配的内容。

你必须重构你的程序才能达到这个目标。

【讨论】:

    【解决方案3】:

    也许您可以使用命名约定来帮助您记住哪个是哪个:

    char *str[10];
    char *str_p[10];
    
    str[i]="Hi";
    
    str_p[k]=strdup("hi");
    

    (或使用带有指针和标志的结构,指示此特定指针是动态分配的)

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      相关资源
      最近更新 更多