2013-02-18 84 views
-1

所以我知道mallocs适用于堆而不是堆栈。内存管理c

我有几个问题:

这段代码是否被分配或释放?

我没有看到任何自由语句,所以我假设什么都没有被释放,所以有内存泄漏正确?

只是为了保持curisoity,如果我尝试释放ptr,它会崩溃。如果我尝试释放处理它虽然工作正常。

int num; 
     int *ptr; 
     int **handle; 

     num = 14; 
     ptr = (int *)malloc(2 * sizeof(int)); 
     handle = &ptr; 
     *ptr = num; 
     ptr = # 
     handle = (int **)malloc(1 * sizeof(int **)); 

回答

6

是的,这段代码使用malloc调用分配内存。当您尝试在末尾释放ptr时看到崩溃,不过因为它被重新分配到&num,该分配在堆栈上且不能被释放。不仅因为取消分配堆栈变量是有意义的(因为它将在函数退出时被抛弃),但由于它没有被明确分配,所以这样做也是不合法的。您仍然可以免费使用handle,因为它仍然指向它分配的堆本地存储。

要回答你的其他问题,是的,有内存泄漏。此外,因为ptr已被设置为指向其他地方,所以现在不可能释放它指向的原始内存,因为您不再知道原始地址。

1

是的,它分配内存使用malloc这是不释放,所以有泄漏。您覆盖了ptr中地址为num的malloced内存的地址,因此您无法解除该问题。初始malloced内存的地址丢失,所以这是一个泄漏。

1

如果没有空闲,则会发生内存泄漏。 (与valgrind一起检查)

不能释放ptr,因为它指向一个无法释放的堆栈变量存储区(请参阅指令ptr = #)。