当我在这个函数上运行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;
}
答案 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);
是双重释放的示例,因为x
和y
变量包含相同的指针值。双重释放会导致未定义的行为,因此您不希望这样做。使用正确的交换习惯用法可以防止这种情况发生。
答案 1 :(得分:3)
我担心答案是:free
分配完成后,不会在此之前失去对它们的跟踪。
现在你所要做的就是学习深刻的工艺,确保发生......
顺便说一句,你有一个free
'加上一个单独的分配,这是另一个错误。
答案 2 :(得分:2)
如果您要将y
指向的整数值分配给x
指向的整数,那么您可能想要:
*x = *y;
您正在执行的操作是覆盖x
的值,而不是使用其值来访问存储整数的内存(即取消引用它)。
顺便提一下,除了使用当前代码泄漏外,您还可以执行 double free ,因为x
和y
具有相同的值,这也是一个(大) )问题。
答案 3 :(得分:2)
x
指向一个int,然后该地址被x = y;
覆盖(正如您所料),但前一个地址指向的空间未被释放。 x
和y
则包含相同的地址,因此它们都指向内存中的相同空间,因此您的free()
调用都试图释放相同的位置。
如果您不想泄漏这4个字节,请在free(x);
之前放入x = y;
答案 4 :(得分:2)
分配时:
x = y;
你松开了存储在x
中的指针(存储器优先分配的地址)。
要解决它,就是不要这样做。如果你这样做会导致未定义的行为,这可能意味着您的程序崩溃(通常在以后的时间):
free(y);
因为你想要两次释放相同的内存。
我怀疑您想要分配存储在已分配内存中的值,而不是地址,这样做应该这样做:
*x = *y;
而不是 - 这将解决你的“遗失内存”问题和未定义的行为(双重免费)。
答案 5 :(得分:0)
你释放y两次并且从不释放x(因为x现在保持y的值)。
另外,为什么不开始接受更多回复?它可能会让人们更倾向于帮助你。