首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >const char*和free()

const char*和free()
EN

Stack Overflow用户
提问于 2012-06-16 03:50:31
回答 3查看 12.7K关注 0票数 5

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

代码语言:javascript
复制
// 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

如何丢弃data expression包含的内存?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-16 03:54:48

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

最常见的约定是,无论什么代码分配一些数据,都应该释放这些数据。你的例程真的没有责任释放这种争论,因为它甚至无法知道这是不是合法的事情。

票数 9
EN

Stack Overflow用户

发布于 2012-06-16 04:08:08

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

此外,您不应该将expression设置为const char*,因为如您所见,这并不匹配。不过,char*应该没问题。

票数 1
EN

Stack Overflow用户

发布于 2015-08-04 04:51:48

直接直截了当地回答这个问题的是free((void*)expression);,它应该足以解决编译错误。但是,已经有人声明你应该让谁在调用你的函数来管理内存

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11057295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档