【问题标题】:free memory if pointer redirects如果指针重定向则释放内存
【发布时间】:2015-02-22 01:07:44
【问题描述】:

在下面的 coden-p 中,我在理解如何正确释放内存时遇到了一些麻烦:

char *func(char* s){

   /* do something with s */


   // pass s to function, create new string, return this string
   s = function_allocating_mem(s);

   // pass s to function, create new string, return this string
   s = other_function_allocation_mem(s);
   /* do other stuff again */

   return s;
}

int main(void){
    char str[] = "somestring";
    str = func(str);
}

现在我分配了两次不同大小的内存。但如果我做对了,我只是改变指针地址,永远不会释放内存。

我真的不知道,要谷歌找到一个例子

这是正确的,我将如何改变它?

编辑: 我删除了函数的第二个参数。这没有必要也不会令人困惑。

【问题讨论】:

  • str = func(str); 根据您的函数声明没有意义。
  • 您需要确定传递的指针是否需要始终动态分配(在您的示例中不是这种情况),或者您需要传入一些指示指针是否为动态的指示符记忆。此外,如果您要释放传入的指针(即,函数获取指针的所有权),那么在释放它之前您不能丢弃它。
  • function_allocating_memother_function_allocation_mem 只是分配新内存还是他们也调用free(s)
  • 通过声明char str[] = "...",您有一个标签str,编译器将其替换为一个常量值(地址)。声明此变量后,您无法更改此值。

标签: c pointers memory free


【解决方案1】:

当你在你的程序中从堆中分配内存时,你要清楚的理解:

  1. 堆内存在程序中的分配位置。

  2. 堆分配内存的所有权如何从一个函数转移到下一个函数,以及

  3. 在程序结束前释放它的位置。

在您的情况下,假设 function_allocating_memother_function_allocation_mem 没有在输入参数上调用 free,您必须确保在这些函数中分配的内存在 funmain 中被释放.

char *func(char* s, const char* os){
   char* s1 = NULL;
   char* s2 = NULL;
   /* do something with s and os */


   // pass s to function, create new string, return this string
   s1 = function_allocating_mem(s);

   // pass s to function, create new string, return this string
   s2 = other_function_allocation_mem(s1);

   /* do other stuff again */

   // Deallocate memory that was allocated by function_allocating_mem().
   free(s1);


   // Memmory allocated by other_function_allocation_mem is returned to the 
   // calling function.
   return s2;
}

int main(void){
    char str[] = "somestring";

    // This is not legal anyway.
    // str = func(str, "some other string");

    char* s = fun(str);

    // Use s ...

    // Before returning from this function, deallocate memory
    // that was allocated in the call to fun().
    free(s);
}

【讨论】:

  • 好的,谢谢。我明白了,为什么你的代码可以工作,但是如果我不想使用另一个指针,而是覆盖现有的指针怎么办?
  • @Poehli,您可以使用任何变量来存储指针,只要您不丢失需要释放的已分配内存。
  • 好的,但我仍然需要为第二个指针使用另一个 8 位。但你最好地回答了我最初的问题。 +1
【解决方案2】:

在您提供的代码中,释放内存的正确方法是:

char *s2;
s2 = other_function_allocation_mem(s);
free( s );
s = s2;
...
free( s );
return ns;

【讨论】:

  • 想想在之前的free(s) 通话之后other_function_allocation_mem(s)s 得到了什么。
  • @WhozCraig,真实,已修复。
【解决方案3】:

问题太多了。

1. 你声明func 有两个参数。然后你只用一个参数调用它。
2. 你声明 func 返回一个 char*,然后你尝试将它分配给一个 char[]
数组和指针是相关的,但它们不可互换。

3. 在func 中,您永远不会使用参数os
4. 你返回变量ns。它从未被宣布。

【讨论】:

  • 是的,我知道,更新问题并忽略 char[] char* 转换,以作为示例;)
猜你喜欢
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多