繁体   English   中英

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

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

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

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

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

Valgrind 结果

我唯一能想到的是 malloc 不在主 function 中,而是在从属 function 中。 但我不认为 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 ,而没有将任何命令行 arguments 传递给您的程序。 发生这种情况时,它会打印Usage: ./substitution key并退出而不做任何进一步的事情; 特别是没有调用cipher() ,因此没有调用malloc() 所以在这种情况下当然没有 memory 泄漏。

如果你在命令行上运行带有关键参数的程序,并给它一些输入,你应该会看到valgrind报告 memory 泄漏:

==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的测试中,我找不到任何迹象表明他们确实这样做了。

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

似乎在使用 cpputest 库时运行 valgrind 会导致 memory 泄漏错误。 我使用 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 在空白程序上显示大量 memory 泄漏

我正在尝试学习如何使用 valgrind,因此我编写了以下程序: 据我所知,这应该会泄漏任何 memory ,所以我应该得到 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