c - 此 C 代码中是否存在内存泄漏?

标签 c memory-leaks

https://en.wikibooks.org/wiki/Algorithm_Implementation/Mathematics/Extended_Euclidean_algorithm

C 实现在递归函数内调用 malloc。这不是内存泄漏吗?

#include <stdio.h>
#include <stdlib.h>

int mod (int a, int b){
    return a %b; 
}   

int *extendedEuclid (int a, int b){
   int *dxy = (int *)malloc(sizeof(int) *3);

   if (b ==0){
      dxy[0] =a; dxy[1] =1; dxy[2] =0;

       return dxy;
   }
   else{
       int t, t2;
       dxy = extendedEuclid(b, mod(a, b));
       t =dxy[1];
       t2 =dxy[2];
       dxy[1] =dxy[2];
       dxy[2] = t - a/b *t2;

       return dxy;
    }
}

int main(void)
{
   int a =99, b =78;
   int *ptr;

   ptr =extendedEuclid (a, b);
   printf("%d = %d * %d + %d * %d \n",ptr[0], a, ptr[1], b, ptr[2] );

   return 0;        
}

如何释放在递归函数中分配的内存?

最佳答案

Isn't that a memory leak?

是的,是的。每次进行递归调用时,即这里:

dxy = extendedEuclid(b, mod(a, b));

dxy 被新值(又名返回值)覆盖时,刚刚 malloc 的内存泄漏

代码应该更像:

int *extendedEuclid (int a, int b){
    int *dxy;
    if (b ==0){
        dxy = (int *)malloc(sizeof(int) *3);  // Move malloc to here
        dxy[0] =a; dxy[1] =1; dxy[2] =0;

        return dxy;
    }
    else { ....

因此malloc只执行一次,即没有递归调用时

关于c - 此 C 代码中是否存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51985153/

相关文章:

c++ - 读取二进制数据问题

c - 如何从字符串中提取整数?

ruby-on-rails - 递归 ruby​​ 方法中明显的内存泄漏

memory-management - Racket C 结构不会自动回收

使用数组作为可变参数函数的最后一个命名参数会导致缓冲区欠载吗?

c - 无法理解在 little endian 机器中以 c 语言进行类型转换后产生的输出

c - 如何在每次程序运行时从空指针取消引用中崩溃?

c# - 防止 WPF 中的内存泄漏

c - 如何在 Mex 网关功能中为 3 波段或单色图像分配内存?