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

时间:2015-10-23 14:15:22

标签: c memory-leaks valgrind bmp

我正在做一门课程,其中一项任务是创建一个程序,通过修改它们提供的一些代码(简单地复制图像)来调整24位位图图像的大小。调整大小本身不是问题,但是当我使用Valgrind运行内存泄漏检查时,我会继续收到以下消息。我不能为我的生活弄清楚我哪里出错了,并会欣赏一些关于漏洞在哪里的指针(双关语),但仅此而已。

另外,如果你能让我知道我的代码有多好,或者我在编程方面有所改进,我们将不胜感激。

Valgrind message

这是我的代码:

#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;
}

1 个答案:

答案 0 :(得分:5)

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

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

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

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