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

重定向C内存泄漏中的指针,c,pointers,memory-leaks,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

当我在这个函数上运行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;
}

恐怕答案是:
免费
分配,当你完成分配后,在那之前不要忘记它们

现在,你所要做的就是了解工艺的深层次,确保这一切发生



另一方面,您有双重
释放
一个单一分配,上面是另一个错误。

利用适当的交换idom,确保您首先将值分配给临时指针变量,以免丢失最初分配给
y
的指针值:

int* tmp = x;
x = y;
y = tmp;
这可以封装在
void交换(void**a,void**b)
函数中,这样您就不必在代码中添加临时变量。它看起来像:

void swap(void** a, void** b)
{
    void* tmp = *a;
    *a = *b;
    *b = tmp;
}
您可以将其称为
swap(&x,&y)

另外,到目前为止,如果指针交换没有修复,代码

free(x);
free(y);

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

您释放y两次,但永远不会释放x(因为x现在保存y的值)


还有,你为什么不开始接受更多的回复呢?这可能会使人们更愿意帮助您。

如果您希望将
y
指向的整数的值赋给
x
指向的整数,那么您可能需要:

*x = *y;
您正在执行的赋值是覆盖
x
的值,而不是使用其值访问存储整数的内存(即取消引用)


顺便说一句,除了当前代码泄漏外,您还进行了双重释放,因为
x
y
具有相同的值,这也是一个(大)问题。

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

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

分配时:

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

free(y);
因为您试图释放同一内存两次

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

*x = *y;

相反,这将解决你的“记忆丢失”问题和未定义的行为(双重自由)。

仔细看看他做了什么。它总是得到正确的分配大小——即使稍后类型发生变化——这使得它比您的建议更健壮。太好了,这就是我要寻找的!我知道代码不是很有用,但这只是我试图学习的概念。谢谢