我的程序现在所做的是从给定的字符串中拆分操作数和运算符(使用 pcre 正则表达式),并将它们作为单独的元素/字符串放入二维数组中。然而,valgrind 一直告诉我有内存泄漏,尽管我释放了我在代码中所做的所有 calloc?正则表达式中的所有匹配项都从
*raw
中的指针复制到 **buffer
的一段中,然后在全部输出之后,我将它们都释放。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pcre.h>
int compile_expression(char *raw, char **buffer, int segment_count, int segment_size,
char *source, int size, pcre *regex);
int main(void)
{
char input[100] = {0};
int input_size;
fgets(input, 99, stdin);
input_size = strlen(input);
// compile regex
char regex[] = "\\(.+\\)|\\d+\\.?\\d*|[-+*/^]";
const char *errptr;
int erroffset;
pcre *re = pcre_compile(regex, 0, &errptr, &erroffset, NULL);
if (re == NULL)
{
printf("regex compile error");
return -1;
}
char *raw = calloc(20, 10);
char **buffer = calloc(20, sizeof(char*));
if (raw != NULL && buffer != NULL)
{
int err;
err = compile_expression(raw, buffer, 20, 10, input, input_size, re);
// output
if (err == 0)
{
for (int i = 0; i < 20 && buffer[i] != NULL; i++)
{
printf("[ %s ]", buffer[i]);
}
printf("\n");
} else return -1;
}
free(buffer);
free(raw);
return 0;
}
int compile_expression(char *raw, char **buffer, int segment_count, int segment_size,
char *source, int size, pcre *regex)
{
int result = 1;
int last_offset = 0;
char match_buffer[size];
int ovector[30];
for (int i = 0; i < segment_count && result == 1; i++)
{
result = pcre_exec(regex, NULL, source, size, last_offset, 0, ovector, 30);
if (result < 0)
break;
memset(match_buffer, 0, sizeof(match_buffer)); // clear
strncpy(match_buffer, source + ovector[0], ovector[1] - ovector[0]);
buffer[i] = raw + segment_size * i;
strncpy(buffer[i], match_buffer, segment_size - 1);
last_offset = ovector[1];
}
if (result != PCRE_ERROR_NOMATCH && result < 0)
{
return -1;
}
return 0;
}
valgrind 输出
==28424==
1 + 1
[ 1 ][ + ][ 1 ]
==28424==
==28424== HEAP SUMMARY:
==28424== in use at exit: 122 bytes in 1 blocks
==28424== total heap usage: 5 allocs, 4 frees, 2,530 bytes allocated
==28424==
==28424== 122 bytes in 1 blocks are definitely lost in loss record 1 of 1
==28424== at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==28424== by 0x487D70E: pcre_compile2 (in /usr/lib/x86_64-linux-gnu/libpcre.so.3.13.3)
==28424== by 0x1093A0: main (in /home/canada/VScode-projects/test/test)
==28424==
==28424== LEAK SUMMARY:
==28424== definitely lost: 122 bytes in 1 blocks
==28424== indirectly lost: 0 bytes in 0 blocks
==28424== possibly lost: 0 bytes in 0 blocks
==28424== still reachable: 0 bytes in 0 blocks
==28424== suppressed: 0 bytes in 0 blocks
==28424==
==28424== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
事实证明需要释放已编译的正则表达式,
free(re)