【问题标题】:c - unsetenv() implementation, is it necessary to free memory?c - unsetenv() 实现,是否有必要释放内存?
【发布时间】:2015-05-26 10:00:37
【问题描述】:

根据TLPI exercise 6-3的要求,我使用putenv()getenv()和直接修改environ变量实现了setenv()unsetenv()

代码:

// setenv() / unsetenv() impl
// TLPI exercise 6-3

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#define ENV_SEP '='
extern char **environ;

// setenv() impl using putenv() & getenv()
int setenv_impl(const char * name , const char * value , int overwrite ) {
    if(!overwrite && getenv(name)) { // exists & don't overwrite
        return 0;
    } else {
        // construct the new variable
        char *env_var = malloc(strlen(name) + strlen(value) + 2);
        strcpy(env_var, name);
        env_var[strlen(name)] = ENV_SEP;
        strcpy(env_var+(strlen(name)+1), value);

        int result = putenv(env_var);
        if(result==0) {
            return 0;
        } else {
            errno = result;
            return -1;
        }
    }
}

// unsetenv() impl via modifing environ directly,
int unsetenv_impl(const char * name ) {
    char **ep, **sp;
    size_t len;

    len = strlen(name);
    for(ep = environ; *ep != NULL;) {
        if(strncmp(*ep, name, len)==0 && (*ep)[len] == ENV_SEP) {
            // shift all successive elements back 1 step,
            for(sp=ep; *sp != NULL; sp++) {
                *sp = *(sp+1);
            }
        } else {
            ep++;
        }
    }

    return 0;
}

// setenv_impl() test
int setenv_impl_test() {
    char *key = "name";

    setenv_impl(key,"Eric", 1);
    printf("%s\n", getenv(key));

    setenv_impl(key,"Eric2", 0);
    printf("%s\n", getenv(key));

    setenv_impl(key,"Eric3", 1);
    printf("%s\n", getenv(key));

    return 0;
}

// unsetenv_impl() test
int unsetenv_impl_test() {
    char *key = "name";

    setenv_impl(key,"Eric", 1);
    printf("%s\n", getenv(key));

    unsetenv_impl(key);

    char *val = getenv(key);
    printf("%s\n", val==NULL?"NULL":getenv(key));

    return 0;
}

int main(int argc, void *argv[]) {
    // setenv_impl_test();
    unsetenv_impl_test();

    return 0;
}

在我的setevn_impl() 中,我使用malloc() 为新的环境变量分配内存。

但是不知道进程默认环境的内存是怎么分配的。

我的问题是:

  • 在我的unsetenv_impl() 实现中,通过free() 释放已删除环境字符串的内存是否必要/正确?

  • 如果我不释放它,会不会有问题,或者它不会占用太多内存因此可以忽略?


提示:

putenv() 不会复制字符串,它只是让全局变量environ 指向传递给它的字符串。

【问题讨论】:

    标签: c memory-management setenv


    【解决方案1】:

    在您的情况下,如果您不打算非常频繁地设置环境变量导致内存资源耗尽,则没有必要。

    但是,如果您在使用完资源(无论是文件句柄/内存/互斥体)后总是释放资源,那就太好了。通过这样做,您在构建服务器时不会犯这种错误。

    一些服务器预计会 24x7 全天候运行。在这些情况下,任何形式的泄漏都意味着您的服务器最终将耗尽该资源并以某种方式挂起/崩溃。一个简短的实用程序,你的泄漏并不是那么糟糕。任何服务器,任何泄漏都是死亡。帮自己一个忙。自己打扫干净。这是个好习惯

    【讨论】:

    • 所以,我需要跟踪我手动添加的新变量,以便在不再需要时立即释放它?我想知道他们如何在 linux 源代码中实现它以避免内存泄漏...
    • 一个很好的方法是不要在你的代码库中调用 malloc() 和 free()。将它们集中到两个函数中,然后您就可以为所有检查提供一个点,该点也可以进行计数。可以在此处找到详细示例。 stackoverflow.com/a/2983953/2959769
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多