重定向C内存泄漏中的指针
当我在这个函数上运行valgrind时,它说我肯定丢失了4个字节。我知道这是因为我正在重定向x=y中的指针x,因此无法访问第一行中分配的初始内存。我该如何解决这个问题?这里的正确原则是什么?我只是在学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
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;
相反,这将解决你的“记忆丢失”问题和未定义的行为(双重自由)。仔细看看他做了什么。它总是得到正确的分配大小——即使稍后类型发生变化——这使得它比您的建议更健壮。太好了,这就是我要寻找的!我知道代码不是很有用,但这只是我试图学习的概念。谢谢