仅编译一次正则表达式,并在程序退出时进行清理

问题描述 投票:0回答:1

我有一个C函数,该函数接受字符串作为输入并解析为URI。

[此函数每次针对不变的正则表达式模式调用时都会调用regcompregfree

#define URI_REGEX_STR \
    "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"

int
LSUP_term_init(
        LSUP_Term *term, LSUP_term_type type,
        char *data, char *datatype, char *lang)
{

    term->type = type;
    if (data == NULL) return -1;

    if (term->type == LSUP_TERM_URI) {
        // TODO Move this to a code block that is only executed once.
        regex_t ptn;
        int status = regcomp(&ptn, URI_REGEX_STR, REG_EXTENDED);
        assert(status == 0);

        status = regexec(&ptn, data, 0, NULL, 0);
        regfree(&ptn);
        if (status != 0) {
            printf("Error matching URI pattern.\n");

            return(-1);
        }
    }
    // [...]
    return 0;
}

该函数被调用很多,而正则表达式的编译开销在运行时中占了很大一部分。

我的目标是:

  • 仅将ptn编译一次
  • 在程序的整个生命周期中都可用
  • 在退出时将其正确清理(此代码可用作库)

到目前为止,我发现的唯一解决方案是创建一个“环境”结构,该结构将通过main或使用该库的代码进行初始化和拆除。但是,这似乎很麻烦,因为我必须将“环境”指针传递给所有需要它的功能。

是否有更好的方法可以在C语言中实现?例如在退出时释放的全局变量? (我知道当程序终止时,它还是会被释放,但是我知道这是一种不好的做法,而且还会弄乱我的valgrind输出)。

谢谢。

c global
1个回答
0
投票

标准C库提供了一个称为atexit()的函数。您可以使用它来注册一个处理程序,以在程序结束时释放正则表达式。

© www.soinside.com 2019 - 2024. All rights reserved.