2012-03-20 26 views
2

当我在这个函数上运行valgrind时,它说我肯定已经丢失了4个字节。我知道这是因为我重定向x = y中的指针x,从而失去了访问第一行中分配的初始内存的权限。我该如何解决?这里的正确原则是什么?我只是在学习C,所以我试图去理解这一切。谢谢!在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

嗨,杰森是对的 – madper 2012-03-20 01:11:42

回答

2

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

如果你不想只是以前x = y;

+0

太棒了,这就是我要找的!我知道代码不是很有用,但它只是我试图学习的概念。谢谢! – quantum 2012-03-20 01:29:10

3

恐怕答案是:当你与他们所做的free分配和做他们不失去跟踪在此之前。

现在你所要做的就是学手艺的深体上确保这种情况发生......


顺便说一句,你有双重free“编一个分配上面是另一个bug。

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

这可以包裹:

5

通过确保您的值赋给一个临时指针变量第一,这样你就不会失去最初被分配到y指针值利用适当的交换IDOM在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变量包含相同的指针值。双释放导致未定义的行为,所以你不想这样做。使用适当的交换习惯可以防止这种情况。

0

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

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

+0

仔细看看他做了什么。它总是获得分配的权利 - 即使类型稍后改变 - 这使得它更强大,然后您的建议。 – dmckee 2012-03-20 01:04:56

2

如果你正在寻找通过y的整数指向x分配的整数指出价值,那么你可能想:

*x = *y; 

分配你正在做的是覆盖x,而不是使用它的值访问你的整数存储的内存(即解引用它)。

顺便说一句,除了与当前的代码泄露,你也做了双免费因为xy具有相同的价值,这也是一个(大)的问题。

2

泄漏的4个字节,放在free(x);当分配:

x = y; 

你失去的指针存储在(地址previosuly分配的内存) x。 要解决它,只是不要这样做。如果你这样做,你会未定义行为这可能符合意味着你的程序的崩溃(通常在以后的时间):

free(y); 

因为你attemting释放同一内存的两倍。

我怀疑你想分配存储在分配的内存,没有地址,值做,你应该:

*x = *y; 

代替 - 这将解决你的“失去的记忆”的问题和不确定的行为(双自由)。