为什么内存没有被释放?

 杨子诺zoz_492 发布于 2023-02-08 13:21

我试图修复C++中的内存泄漏,我对C++比较陌生,所以也许是一个愚蠢的事情.我有一些代码需要一个屏幕捕获,我正在为Image我分配一些内存然后操作.这是一些相关的代码:

RGBTRIPLE* ScreenShot(char *BmpName, DWORD &height, DWORD &width, char* bmpToFree){
    DWORD FileSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBTRIPLE)+1 * (Width*Height * 4));
    char *BmpFileData = (char*)GlobalAlloc(0x0040, FileSize);

    // Some code

    BitBlt(CaptureDC, 0, 0, Width, Height, DevC, 0, 0, SRCCOPY | CAPTUREBLT);
    GetDIBits(CaptureDC, CaptureBitmap, 0, Height, Image, (LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS);

    height = Height;
    width = Width;
    bmpToFree = BmpFileData;

    DeleteObject(CaptureBitmap);
    DeleteObject(CaptureDC);
}

正如你所看到的,我没有释放BmpFileData GlobalFree(BmpFileData)因为我仍然需要在另一个方法中使用这个数据所以我保持一个引用将指针传递给这一行中的另一个指针bmpToFree = BmpFileData;

所以现在我对这些数据做了一些工作,然后我用GlobalFree()这种方式:

char* bmpToFree = NULL;

RGBTRIPLE *image = ScreenShot("Prueba.bmp", h, w, bmpToFree);
// Do some work
GlobalFree(bmpToFree);

但就这样我有内存泄漏.如果我改为放入GlobalFree(BmpFileData)内部Screenshot()方法,我的泄漏消失了,但我没有数据可以处理.

我究竟做错了什么?

1 个回答
  • 问题是bmpToFree应该是对指针的引用.

    RGBTRIPLE* ScreenShot(.., char* bmpToFree)
    

    应该

    RGBTRIPLE* ScreenShot(.., char* &bmpToFree)
    

    或者你可以用另一种方式解决问题.

    RGBTRIPLE* ScreenShot(.., char** bmpToFree)
    {
       ...
       *bmpToFree = BmpFileData;
    }
    

    它们基本相同,可以&是变量(char *)的reference(),也可以是变量()的指针*(char *).当您需要更改传入的原始变量而不是副本时,可以使用它们.

    2023-02-08 13:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有