从外部函数释放指针

时间:2015-08-21 05:29:37

标签: c pointers malloc

我编写了一个使用堆栈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)?

4 个答案:

答案 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。如果mallocnew_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语句。如果ifreturnElement,则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()一起发布的资源。

BTW:考虑不要不必要地复制东西。你对free()的调用对我来说似乎是多余的,只需返回指向const int的指针,引用现有元素,你应该没问题。