繁体   English   中英

为什么 valgrind 在我的程序中没有显示明显的泄漏? [关闭]

Why does valgrind not show the obvious leaks in my program? [closed]

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

当我编译一个使用了 malloc 两次的程序时,我意识到我忘记在程序结束时释放分配的内存。

最近遇到了 Valgrind 工具,我认为这是运行它以查看它如何显示内存泄漏错误的好机会。 但令我惊讶的是,Valgrind 返回所有堆块都被释放了......

Valgrind 结果

我唯一能想到的是 malloc 不在主函数中,而是在从属函数中。 但我不认为 Valgrind 会被限制在 main 上,是吗?

我试图在 Valgrind 文档中找到答案,但无济于事。

这是请求的完整代码,其目的是通过用户作为命令行参数提供的 26 个字母的密钥来加密文本。

#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

void cipher(char *, char *);

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    //INPUT
    char *p = get_string("plaintext: ");

    //OUTPUT
    cipher(argv[1], p);
    return 0;
}

void cipher(char *a, char *b)
{
    char *low = malloc(27 * sizeof(char));
    for (int i = 0; i < 27; i++)
    {
        if (islower(a[i]))
        {
            low[i] = a[i];
        }
        else
        {
            low[i] = (a[i] + 32);
        }
    }

    char *upp = malloc(27 * sizeof(char));
    for (int i = 0; i < 27; i++)
    {
        if (isupper(a[i]))
        {
            upp[i] = a[i];
        }
        else
        {
            upp[i] = a[i] - 32;
        }
    }

    printf("ciphertext: ");

    for (int i = 0, l = strlen(b); i < l; i++)
    {
        if (islower(b[i]))
        {
            printf("%c", low[(int)b[i]-97]);
        }
        else if (isupper(b[i]))
        {
            printf("%c", upp[(int)b[i]-65]);
        }
        else
        {
            printf("%c", b[i]);
        }
    }
}
1 个回复

在所有这些评论之后,答案有点愚蠢......

您的屏幕截图显示您运行了valgrind ./substitution ,而没有将任何命令行参数传递给您的程序。 发生这种情况时,它会打印Usage: ./substitution key并退出而不做任何进一步的操作; 特别是没有调用cipher() ,因此没有调用malloc() 所以当然在这种情况下没有内存泄漏。

如果你在命令行上使用 key 参数运行程序,并给它一些输入,你应该看到valgrind报告内存泄漏:

==15815== 
==15815== HEAP SUMMARY:
==15815==     in use at exit: 54 bytes in 2 blocks
==15815==   total heap usage: 4 allocs, 2 frees, 2,102 bytes allocated
==15815== 
==15815== LEAK SUMMARY:
==15815==    definitely lost: 54 bytes in 2 blocks
==15815==    indirectly lost: 0 bytes in 0 blocks
==15815==      possibly lost: 0 bytes in 0 blocks
==15815==    still reachable: 0 bytes in 0 blocks
==15815==         suppressed: 0 bytes in 0 blocks
==15815== Rerun with --leak-check=full to see details of leaked memory

尽管原则上编译器可以优化malloc调用,但在我使用 gcc 和带有-O3 clang 的测试中,我找不到任何迹象表明它们实际上这样做了。

3 Valgrind在cpputest TEST()宏中显示内存泄漏

似乎在使用cpputest库时运行valgrind会导致内存泄漏错误。 我使用CLion + WSL(GCC + Valgrind)。 在泄漏报告中列出了包含TEST()宏的每一行。 我认为它们不是真正的泄漏(是吗?)。 当您展开宏时,您会看到类似以下内容的内容: ...

4 Valgrind在Stringstream中显示可达泄漏

我正在使用“ std :: stringstream”将“ long”值转换为“ hex-string”,以便在代码中进一步使用。 程式码片段如下: 但是,valgrind在“可达泄漏”中列出了位置。 由于流是方法本地的,并且不应超出方法的范围存在(即使它在内部进行分配), ...

5 Valgrind:C程序中绝对会丢失内存泄漏

我正在编写一个迷宫问题程序。 我可以成功获得路径的方向。 但是,我肯定会从valgrind报告中迷失方向和出错。 我的代码有什么问题? 以下是我的代码: Valgrind报告: 我从泄漏摘要中得到了“绝对丢失:318个块中的1,908字节”,从错误摘要中得到了来自4个 ...

7 valgrind 中的泄漏错误

我在 valgrind 中使用了我的程序,但出现了 2 个错误: 错误指向一个函数: 第 215 行中的第一个是malloc()服务; 第 225 行中的第二个是realloc()服务。 我找不到问题。 原始代码太长,我释放了我创建的所有mallocs/reallocs 。 ...

8 Valgrind在空白程序上显示大量内存泄漏

我正在尝试学习如何使用valgrind,因此我编写了以下程序: 据我所知,这应该会泄漏所有内存,因此我应该从valgrind得到答复,指出这一点。 但是,这是valgrind显示的内容: 关于此的几个问题: 为什么说最后使用19,158个字节? 我以为最后应该有零个 ...

10 即使内存明显被释放,C ++ Valgrind内存泄漏

我有一个带有双指针成员的A类 在类的构造函数中为其分配的内存为 现在,全班不得不处理两种情况。 它可以单独工作,在这种情况下,_E在析构函数中被删除。 或者在另一种情况下,它需要与同一成员上的另一个B类合作。 在后一种情况下,我想将_E的位置重置为另一个地址。 为此, ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM