重定向C内存中的指针泄漏

时间:2012-03-20 00:58:47

标签: c pointers memory-leaks

当我在这个函数上运行valgrind时,它说我肯定丢失了4个字节。我知道这是因为我在x = y中重定向指针x,因此无法访问第一行中分配的初始内存。我该如何解决?这里的正确原则是什么?我只是在学习C,所以我试图掌握所有这些。谢谢!

int main() {
  int* x = malloc(sizeof(*x));
  int* y = malloc(sizeof(*y));
  *x = 2;
  *y = 5;
  x = y;
  *y = 6;
  *x = 4;
  printf("y = %d\n", *y);

  free(x);
  free(y);

  return 0;
}

6 个答案:

答案 0 :(得分:5)

通过确保首先将值分配给临时指针变量来利用正确的交换idom,这样就不会丢失最初分配给y的指针值:

int* tmp = x;
x = y;
y = tmp;

这可以包含在void swap(void** a, void** b)函数中,这样您就不必使用临时变量来丢弃代码。它看起来像是:

void swap(void** a, void** b)
{
    void* tmp = *a;
    *a = *b;
    *b = tmp;
}

你可以称之为swap(&x, &y);

此外,截至目前,未修复指针交换,代码

free(x);
free(y);

是双重释放的示例,因为xy变量包含相同的指针值。双重释放会导致未定义的行为,因此您不希望这样做。使用正确的交换习惯用法可以防止这种情况发生。

答案 1 :(得分:3)

我担心答案是:free分配完成后,会在此之前失去对它们的跟踪。

现在你所要做的就是学习深刻的工艺,确保发生......


顺便说一句,你有一个free'加上一个单独的分配,这是另一个错误。

答案 2 :(得分:2)

如果您要将y指向的整数值分配给x指向的整数,那么您可能想要:

*x = *y;

您正在执行的操作是覆盖x,而不是使用其值来访问存储整数的内存(即取消引用它)。

顺便提一下,除了使用当前代码泄漏外,您还可以执行 double free ,因为xy具有相同的值,这也是一个(大) )问题。

答案 3 :(得分:2)

x指向一个int,然后该地址被x = y;覆盖(正如您所料),但前一个地址指向的空间未被释放。 xy则包含相同的地址,因此它们都指向内存中的相同空间,因此您的free()调用都试图释放相同的位置。

如果您不想泄漏这4个字节,请在free(x);之前放入x = y;

答案 4 :(得分:2)

分配时:

x = y;

你松开了存储在x中的指针(存储器优先分配的地址)。 要解决它,就是不要这样做。如果你这样做会导致未定义的行为,这可能意味着您的程序崩溃(通常在以后的时间):

free(y);

因为你想要两次释放相同的内存。

我怀疑您想要分配存储在已分配内存中的值,而不是地址,这样做应该这样做:

*x = *y;
而不是 - 这将解决你的“遗失内存”问题和未定义的行为(双重免费)。

答案 5 :(得分:0)

你释放y两次并且从不释放x(因为x现在保持y的值)。

另外,为什么不开始接受更多回复?它可能会让人们更倾向于帮助你。