5

给定下一个代码示例,我无法释放参数const char* expression

// removes whitespace from a characterarray
char* removewhitespace(const char* expression, int length)
{
    int i = 0, j = 0;
    char* filtered;
    filtered = (char*)malloc(sizeof(char) * length);
    while(*(expression + i) != '\0')
    {
        if(!(*(expression + i) == ' '))
        {
            *(filtered + j) = *(expression + i);
            j++;
        }
        i++;
    }
    filtered[j] = '\0';
    free(expression); //this doesn't seem to work
    return filtered;
}

在返回此函数之前,我尝试释放表达式参数中的数据,但似乎无法释放它。
我认为这可能是因为它是一个常量,但我了解到 C 中的字符数组始终应该是一个常量。

我收到的错误消息与消息是一致free(expression)的,消息是:
expected void* but argument is of type const char * - compiler error

如何丢弃数据expression包含的内存?

4

3 回答 3

9

如果它是一个常量,这意味着它不应该被删除,因为它没有被分配:调用者很容易将一个基于堆栈的数组传递给你的方法,释放它是一件坏事

最常见的约定是任何代码分配一些数据都应该释放数据。消除这种争论真的不是你的例行公事的责任,因为它无法知道这是否是合法的事情。

于 2012-06-15T19:54:47.503 回答
1

如果你真的想要一个这样的函数——获取一个堆指针,释放它,尽管返回另一个堆指针——你应该很好地记录它。

此外,您不应该制作expressiona const char*,因为如您所见,这不匹配。char*不过应该没问题。

于 2012-06-15T20:08:07.503 回答
1

直接直接提出问题 free((void*)expression); 应该足以解决编译错误。 但是,正如其他人已经声明的那样,您应该让谁在调用您的函数来管理内存

于 2015-08-03T20:51:48.087 回答