我如何解决munmap_chunk():regfree上的无效指针(和正则表达式)[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何解决munmap_chunk():regfree上的无效指针(和正则表达式)[关闭]相关的知识,希望对你有一定的参考价值。

你好我在munmap_chunk(): invalid pointer上获得regfree(&regexCompiled); regexCompiled已分配。

问题是只有在找到匹配时才会发生这种情况,否则它会正常工作

一步之后:

这是功能代码:

char * WebServer::get_db_query(char * line) {
  const char * regex = "<sql\s+db=(.+?)\s+query=(.+;)\s*\\>";
  size_t maxGroups = 3;
  char * ret = (char * ) malloc(sizeof(char));
  regex_t regexCompiled;
  regmatch_t groupArray[maxGroups];

  if (regcomp( & regexCompiled, regex, REG_EXTENDED)) {
    printf("Could not compile regular expression.
");
    fflush(stdout);
    return NULL;
  };

  if (!regexec( & regexCompiled, line, maxGroups, groupArray, 0)) {
    char copy[strlen(line) + 1];
    strcpy(copy, line);
    copy[groupArray[1].rm_eo] = '';
    copy[groupArray[2].rm_eo] = '';
    matched = true;
    sprintf(ret, "%s;%s", copy+ groupArray[1].rm_so, copy+ groupArray[2].rm_so);
    printf("Match %s
",
      copy+ groupArray[1].rm_so);
    printf("Match %s
",
      copy+ groupArray[2].rm_so);
    fflush(stdout);
  }

  regfree( & regexCompiled);
  return ret;
}
答案

使用reg*()函数是正确的。

通过释放regex_t程序崩溃,这通常意味着内存管理之前已经搞砸了。

这就是您展示的代码中发生的事情:

这条线

 char * ret = (char * ) malloc(sizeof(char));

恰好分配一个char,这使得ret只指向一个空字符串。

然后在这里

 sprintf(ret, "%s;%s", copy+ groupArray[1].rm_so, copy+ groupArray[2].rm_so);

代码复制大量数据为ret点。

根据需要为ret分配尽可能多的内存。肯定只有一个char很少。

另一答案

使用char * ret = (char * ) malloc(sizeof(char));,您只需分配一个字符。

当你以后再做sprintf(ret, "%s;%s", ..时,你会超越这一个字符,所以你会破坏记忆。

然后在任何以后的时刻,当堆检测到它已被破坏时,您可能会遇到问题。

分配多个char。

以上是关于我如何解决munmap_chunk():regfree上的无效指针(和正则表达式)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在基数排序中,我得到 munmap_chunk(): invalid pointer 和 Aborted (core dumped)。为啥?

C 语言错误 munmap_chunk(): invalid pointer Aborted (core dumped)

如何正确删除 std::string 数组 [重复]

如何调整类中动态分配的数组的大小?

linux中使用pip命令遇到的一些问题

我需要帮助解决这个 JDBC 异常错误,如何解决这个问题?