我编写了一个使用堆栈ADT的程序 main创建一个新堆栈,同时提供3个函数供用户使用:
data = [
('1', ['45', '55', '56', '57']),
('2', ['200', '202', '202']),
('3', ['500', '501', '502']),
]
for dataset_name, dataset in data:
with open('{}.csv'.format(dataset_name), 'w') as outfile:
for item in dataset:
outfile.write('{}\n'.format(item))
当我打电话给'偷看'功能时:
Stack my_stack = sCreate (copy_int, free_int, print_int);
我有内存泄漏。
peek函数看起来像这样:
printf ("Peek: |%d|\n\n", *(int*)sPeek(my_stack));
它可能是由那里调用的copy_function引起的,它是用户给出的copy_int:
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_int中释放指针(malloc)?
答案 0 :(得分:2)
findViewById(mContainerId)
似乎有点明显,所以不确定这是不是你的意思。
答案 1 :(得分:1)
如何从copy_int中释放指针(malloc)?
如果您不再需要,请随时致电Ratio = @Correct answers/Attempted questions
。
也在这里
free()
int * new_int = (int*) malloc(sizeof(int*));
*new_int = *(int*)element;
if (NULL != new_int)
return new_int;
else
return NULL;
的测试应该在取消引用指针NULL
之前完成:
element
注意:在C中不需要投射int *new_int = malloc(sizeof(int*));
if (NULL != new_int)
{
*new_int = *(int*)element;
return new_int;
}
else
return NULL;
的结果,也不建议以任何方式投射。{/ p>
同样^ 2这里对malloc/calloc/realloc
的调用:
free()
使用较少,因为if (NULL == returnElement){
free (returnElement);
return NULL;
}
没有任何内容,因为free()
无处携带returnElement
。你想删除它。
答案 2 :(得分:1)
在上一个代码段中,您在检查 isFileNameValid: function (value)
{
return new RegExp("([\\\:\*\?\"\<\>\|\/])").test(value);
}
的返回值之前使用的是*new_int
。如果malloc
为new_int
,则会导致细分错误。此外,NULL
完全没有价值。这四行可以用if/else
替换,在任何情况下都不会改变行为。最后,don't cast the return value from malloc。
修复所有这些问题后,最后一个代码片段如下所示
return new_int;
在Element copy_int (Element element)
{
int *new_int = malloc(sizeof(int));
if ( new_int )
*new_int = *(int*)element;
return new_int;
}
函数中,您有一个类似的无价值sPeek
语句。如果if
为returnElement
,则NULL
没有任何内容。所以free
函数应该是
sPeek
最后针对您的问题,Element sPeek (Stack stack)
{
if ( stack && stack->used_places > 0 )
return stack->copy_function(stack->stack_array[stack->used_places-1]);
else
return NULL;
}
返回的内存将泄露,除非您保留该指针的副本,并且copy_int
当您完成该指针时。此外,如果将NULL指针传递给free
,则会要求另一个分段错误。因此printf
行需要替换为此代码(假设printf
确实是Element
)
void *
答案 3 :(得分:1)
任何返回使用后未自动释放的资源的函数都必须具有如何释放资源的文档。对于malloc()
,它被记录为free()
,fopen()
fclose()
等。
当您自己创建一个功能时,您可以例如如果您返回从free()
收到的指针,请参阅malloc()
。如果您的设置更复杂,则可能需要创建自己的功能。
查看您的函数,使用malloc()
分配内存,然后分配给内存(如果分配失败,则验证为时太晚),然后返回从{{1}收到的指针}。因此,您将返回一个可以(并且必须!)与malloc()
一起发布的资源。
free()
的调用对我来说似乎是多余的,只需返回指向const int的指针,引用现有元素,你应该没问题。