你好我在munmap_chunk(): invalid pointer
上获得regfree(®exCompiled);
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.\n");
fflush(stdout);
return NULL;
};
if (!regexec( & regexCompiled, line, maxGroups, groupArray, 0)) {
char copy[strlen(line) + 1];
strcpy(copy, line);
copy[groupArray[1].rm_eo] = '\0';
copy[groupArray[2].rm_eo] = '\0';
matched = true;
sprintf(ret, "%s;%s", copy+ groupArray[1].rm_so, copy+ groupArray[2].rm_so);
printf("Match %s\n",
copy+ groupArray[1].rm_so);
printf("Match %s\n",
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。