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



我有一个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 库提供了一个名为atexit()的函数。您可以使用它来注册处理程序,以便在程序结束时释放正则表达式。

最新更新