Valgrind C++ 内存泄漏

6

我有这段可演示的代码:

#include <cstdlib>
#include <cstdio>

int main() {
    int ** matrix = NULL;
    int c = 1, input = 0;

    printf("Enter first row of the matrix:\n");
    while (!feof(stdin)) {
        input = fgetc(stdin);

        matrix = (int**) realloc(matrix, 1 * sizeof (int*));
        if (matrix == NULL) {
            printf("Troubles with memory allocation!\n");
            return 0;
        }
        matrix[0] = (int *) realloc(matrix[0], c * sizeof (int));
        matrix[0][c-1] = (int) input;

        c++;
    }

    free(matrix[0]);
    free(matrix);

    return 0;
}

这会导致Valgrind出现错误,但我真的不知道这意味着什么以及如何修复它……有人能给我建议吗?

==30031== 1 errors in context 1 of 1:
==30031== Conditional jump or move depends on uninitialised value(s)
==30031==    at 0x402868B: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==30031==    by 0x80485CB: main (main.cpp:17)
==30031==  Uninitialised value was created by a heap allocation
==30031==    at 0x402860A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==30031==    by 0x4028694: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==30031==    by 0x80485A6: main (main.cpp:12)

1
在第二次realloc调用之前,您尚未初始化matrix[0]。它可能被填充任何内容。 - wj32
6
顺便说一句,考虑使用STL容器,std::vector<int>是最合适的选择。无需重新分配内存,不必麻烦。 - Dialecticus
如果是二维数组,应该用哪个值来填充它? - Radek Simko
realloc 函数的功能取决于第一个参数的值。在您的情况下,它必须为 NULL,否则会导致崩溃。 - Šimon Tóth
1
你的二维数组实际上是(指向(malloc分配的int型指针数组的指针)的指针); 所以你应该用NULL填充它们;但是,采纳@Dialecticus的建议,使用vector可以省去一些麻烦。 - Lie Ryan
如果这不仅仅是演示代码,而是您考虑过的事情:将矩阵创建为数组的数组是一个坏主意。实现问题已经得到了证明,但在大小上(1 * n个额外指针)和性能上(间接寻址)与在一个连续的内存区域中计算元素位置(例如:pos = row * columns + col)相比,这也是一个不好的选择。另一方面:有很好的矩阵库可用,可以为您完成这项工作,并考虑效率,如eigen2。 - Chris
3个回答

6

matrix[0] = (int *) realloc(matrix[0], c * sizeof (int));

您正在将未初始化的matrix [0]作为参数传递。

请注意,此代码行意在重新分配内存并将其指针存储在matrix [0]中。


2

我建议你使用Deleaker——一款强大的调试内存泄漏工具!


4
我已为您添加了该软件的链接,欢迎访问z0r1fan网站! - Richard J. Ross III

2
您可以使用更强大的工具。BoundsChecker、Deleaker、XWatcher...

1
你的链接已损坏。 - z0r1fan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接