【发布时间】:2015-08-21 05:29:36
【问题描述】:
我编写了一个使用堆栈 ADT 的程序。
main 创建了一个新堆栈,同时为用户提供了 3 个函数供用户使用:
Stack my_stack = sCreate (copy_int, free_int, print_int);
当我调用“窥视”功能时:
printf ("Peek: |%d|\n\n", *(int*)sPeek(my_stack));
我有内存泄漏。
peek 函数如下所示:
Element sPeek (Stack stack){
if ((NULL == stack) || (0 >= stack->used_places))
return NULL;
Element returnElement = stack->copy_function(stack->stack_array[stack->used_places-1]);
if (NULL == returnElement){
free (returnElement);
return NULL;
}
return returnElement;
这可能是由那里调用的copy_function引起的,也就是用户给的copy_int:
Element copy_int (Element element){
int *new_int = (int*) malloc(sizeof(int*));
*new_int = *(int*)element;
if (NULL != new_int)
return new_int;
else
return NULL;
如何从 copy_int 释放指针(malloc)?
【问题讨论】:
-
与您的问题没有直接关系,但您真的认为为一个 int 指针 (
malloc(sizeof(int*))) 分配空间是个好主意吗? -
你是否建议在堆栈上做同样的事情?我的意思是没有malloc?
-
尽可能不要使用
malloc,在这种情况下,你根本不需要malloc,你可以简单地返回int而不使用malloc:@987654329 @ -
您的 peek 原语不应复制任何内容。窥视的意思。你不会复制你想看的东西。 Push 应该复制,pop 应该释放。或者,如果您确实想制作一份副本以供查看,则用户有责任在使用后对其进行清理。
-
同时告诉您的用户他们的
copy_int是错误的。数数你的星星:Type <n stars> name = malloc(nelems * sizeof(Type <n-1 stars>))。简单!并且不要强制转换 malloc 的 rwturn 值。