【发布时间】:2021-01-25 18:34:41
【问题描述】:
当我编译一个使用 malloc 两次的程序时,我意识到我忘记在程序结束时释放分配的内存。
最近遇到了 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]);
}
}
}
【问题讨论】:
-
你使用了哪些命令行参数来调用 valgrind?
-
请编辑您的问题并发布所有您的代码。从您所做 发布的内容来看,您应该 有泄漏。我合成了你程序的其余部分,你确实有一个内存,
valgrind报告 [here]:definitely lost: 64 bytes in 3 blocks另外,这似乎是cs50,get_string返回的指针是分配,所以你也需要free。 旁注:这有点没有意义,因为更好的设计可以用char upp[27];和char low[27];替换upp和low,消除malloc -
同意,这需要minimal reproducible example。例如,编译器优化可能导致
malloc实际上没有被某些输入调用。我们需要完整的源代码、使用的准确输入、编译器版本和选项以及 valgrind 选项。 -
对于您的问题,不,
valgrind不限于main,并且应该跟踪和报告所有malloc分配的泄漏,无论是什么功能。 -
将图像中可见的线条粘贴为文本而不是图像会改善问题
标签: c malloc valgrind free cs50