首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C正确使用free

C正确使用free
EN

Stack Overflow用户
提问于 2012-08-28 21:31:54
回答 4查看 258关注 0票数 1

我相信我这样做是对的,但我想确认一下。在一个程序中,我使用了两个指针,这两个指针指向函数返回的已分配内存。当我使用完那个内存时,我会free()它,然后我会使用同样的指针来指向一个新分配的内存空间。这里是我的程序,给出一个例子来说明我的意思(注释以显示我的思维过程):

代码语言:javascript
复制
int main(void)
{
    char *data, *url;
        int i = 1;

    while(i)
    {
        printf("Enter URL: ");
        if(!(url = getstr())) return 1;                                  //url now points to allocated memory from getstr();
        if(strlen(url) <= 0) i = 0;
        if(data = readsocket(url, 80, "http")) printf("\n%s\n\n", data); //data now points to allocated memory from readsocket();
        else printf("\n\n");
        free(url);                                                       //free allocated memory that url points to url
        free(data);                                                      //free allocated memory that data points to data
    }
    return 0;
}

这是正确的吗,还是有更好的更普遍的更好的方法来做到这一点?还是我做的完全错了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-28 21:36:31

假设您的函数getstrreadsocket在内部对内存进行malloc操作,那么这是完全没有问题的。

我唯一的建议是,在与释放内存相同的作用域中分配内存通常是有帮助的,这通常有助于推断何时需要释放内存。

例如:

代码语言:javascript
复制
url = malloc(URL_MAX_LEN);
if (!url) return 1;
if (!getstr(url)) {
    free(url);
    return 1;
}
/* do something with url */
free(url);

如果你有很多对象和退出点,使用goto可以很好的做到这一点。

代码语言:javascript
复制
object1 = malloc(OBJECT1_SIZE);
/* do work, if there's an error goto exit1 */
object2 = malloc(OBJECT2_SIZE);
/* do work, if there's an error goto exit2 */
object3 = malloc(OBJECT3_SIZE);
/* do work, if there's an error goto exit3 */
exit3:
free(object3);
exit2:
free(object2);
exit1:
free(object1);
return 1;

如果您的对象变得更加复杂,并且需要大量工作来创建和销毁,那么您可以包装malloc和free,但将与malloc/free完全相同的规则应用于创建/销毁函数以避免泄漏是至关重要的。作为一个好的实践,你应该总是有一个销毁来匹配一个创建,即使它只是包装自由。这样就很难出错了。

代码语言:javascript
复制
struct x *create_x() {
    struct x *p = malloc(10);
    p->val1 = 7;
    return p;
}
void destroy_x(struct x *p) {
    free(p);
}
票数 5
EN

Stack Overflow用户

发布于 2012-08-28 21:35:59

您的代码没有问题,但是您可以为数据和url预先分配内存,并将它们作为参数传递给getstrreadsocket函数。这将会更有效率。

票数 2
EN

Stack Overflow用户

发布于 2012-08-28 21:36:14

如果函数getstrreadsocket使用例如malloc来分配内存,那么你所做的一切都是可以的。

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

https://stackoverflow.com/questions/12160385

复制
相关文章

相似问题

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