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

qua*_*tum 2 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;
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*son 5

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

int* tmp = x;
x = y;
y = tmp;
Run Code Online (Sandbox Code Playgroud)

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

void swap(void** a, void** b)
{
    void* tmp = *a;
    *a = *b;
    *b = tmp;
}
Run Code Online (Sandbox Code Playgroud)

你会称之为swap(&x, &y);.

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

free(x);
free(y);
Run Code Online (Sandbox Code Playgroud)

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