C 内存泄漏尽管释放一切

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

我的程序现在所做的是从给定的字符串中拆分操作数和运算符(使用 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)
c memory-leaks pcre
1个回答
0
投票

事实证明需要释放已编译的正则表达式,

free(re)

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