检查内存泄漏时 Valgrind 可能丢失消息 - C

Valgrind possibly lost message when checking for memory leaks - C

我目前正在上一门课程,其中一项任务是创建一个程序,通过修改它们提供的一些代码(仅复制图像)来调整 24 位位图图像的大小。调整大小本身不是问题,但是当我 运行 使用 Valgrind 检查内存泄漏时,我不断收到以下消息。我终其一生都无法弄清楚哪里出了问题,希望得到一些关于泄漏位置的指示(双关语肯定是故意的),但仅此而已。

此外,如果您能让我知道我的代码有多好,或者我可以通过哪些方式改进一般的编程,我们将不胜感激。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

#include "bmp.h"

int main(int argc, char* argv[])
{
    // ensure proper usage
    if (argc != 4)
    {
        printf("Usage: ./copy n infile outfile\n");
        return 1;
    }

    // remember factor and filenames
    int n = atoi(argv[1]);
    char* infile = argv[2];
    char* outfile = argv[3];

    // check if scale factor is valid (i.e. between 1 and 100)
    if ((n < 1) || (n > 100))
    {
        printf("Invalid scale factor, enter value between 1 and 100 inclusive\n");
        return 2;
    }

    // open input file 
    FILE* inptr = fopen(infile, "r");
    if (inptr == NULL)
    {
        printf("Could not open %s.\n", infile);
        return 3;
    }

    // open output file
    FILE* outptr = fopen(outfile, "w");
    if (outptr == NULL)
    {
        fclose(inptr);
        fprintf(stderr, "Could not create %s.\n", outfile);
        return 4;
    }

    // read infile's BITMAPFILEHEADER
    BITMAPFILEHEADER bf;
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);

    // read infile's BITMAPINFOHEADER
    BITMAPINFOHEADER bi;
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);

    // create headers for outfile
    BITMAPFILEHEADER bfout = bf;
    BITMAPINFOHEADER biout = bi;

    // change output's header info w.r.t. n, the scale factor
    biout.biWidth *= n;
    biout.biHeight *= n;
    biout.biSizeImage *= n * n;
    bfout.bfSize = sizeof(BITMAPFILEHEADER) + 
                   sizeof(BITMAPINFOHEADER) + 
                   biout.biSizeImage;

    // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
    if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || 
        bi.biBitCount != 24 || bi.biCompression != 0)
    {
        fclose(outptr);
        fclose(inptr);
        fprintf(stderr, "Unsupported file format.\n");
        return 5;
    }

    // write outfile's BITMAPFILEHEADER
    fwrite(&bfout, sizeof(BITMAPFILEHEADER), 1, outptr);

    // write outfile's BITMAPINFOHEADER
    fwrite(&biout, sizeof(BITMAPINFOHEADER), 1, outptr);

    // determine padding for scanlines
    int paddingIn = (4 - (bi.biWidth * sizeof(RGBTRIPLE) % 4)) % 4;
    int paddingOut = (4 - (biout.biWidth * sizeof(RGBTRIPLE) % 4)) % 4;

    // iterate over infile's scanlines
    for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
    {
        //create buffer and set to row's pixels
        RGBTRIPLE* buffer = malloc(bi.biWidth * sizeof(RGBTRIPLE));
        fread(buffer, sizeof(RGBTRIPLE), bi.biWidth, inptr);

        // for each infile scanline, copy n times
        for (int j = 0; j < n; j++)
        {
            // iterate over pixels in scanline
            for (int k = 0; k < bi.biWidth; k++)
            {   
                // copy pixel n times
                for (int l = 0; l < n; l++)
                    fwrite(&buffer[k], sizeof(RGBTRIPLE), 1, outptr);

            }

            // then add padding to Outfile (if needed)
            for (int k = 0; k < paddingOut; k++)
                fputc(0x00, outptr);

        }

        // move past padding on infile
        fseek(inptr, paddingIn, SEEK_CUR);

        // free the buffer
        free(buffer);
    }

    // close infile
    fclose(inptr);

    // close outfile
    fclose(outptr);

    // that's all, folks
    return 0;
}

您正在分析 resize,这是您系统上的二进制可执行文件。

如果调用程序前没有 ./,shell 将在 PATH 变量中输入的每个目录中搜索具有此名称的程序( echo $PATH 可以看到),但不在当前目录中。

您必须使用 ./resize 调用您的程序,因此它会在 . 目录(您的当前目录)中查找并启动您的程序。

输出 Usage: resize [-u] [-c] [-s [rows cols]] 与您的代码不匹配。