【问题标题】:Freeing memory error?释放内存错误?
【发布时间】:2015-08-28 02:53:40
【问题描述】:

我需要释放bitpointer,因为这个函数被执行了多次并且内存使用量因为我不明白的原因而增长,并且它在达到 22mb 的内存使用量后崩溃。如果我尝试删除@ 987654322@ 像这样delete []bitpointerfree(bitpointer)我得到访问冲突错误。但我不明白为什么,因为函数不应该再使用指针,并且设置了新的红蓝绿值..

void Get_Color(int x,int y,int w,int h,int &red,int &green,int &blue,int action)
{
    HDC hdc, hdcTemp;
    RECT rect;
    BYTE*bitPointer=new BYTE[4*h*w];
    HWND Desktop = GetDesktopWindow();
    hdc = GetDC(Desktop);
    GetWindowRect(Desktop, &rect);
    hdcTemp = CreateCompatibleDC(hdc);
    BITMAPINFO bitmap;
    bitmap.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bitmap.bmiHeader.biWidth = w;
    bitmap.bmiHeader.biHeight = h;
    bitmap.bmiHeader.biPlanes = 1;
    bitmap.bmiHeader.biBitCount = 32;
    bitmap.bmiHeader.biCompression = BI_RGB;
    bitmap.bmiHeader.biSizeImage = 0;
    bitmap.bmiHeader.biClrUsed = 0;
    bitmap.bmiHeader.biClrImportant = 0;
    HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
    SelectObject(hdcTemp, hBitmap2);
    BitBlt(hdcTemp, 0, 0, w, h, hdc, x, y, SRCCOPY);
    if(action==1)
    {
        for(int j=0;j<=w*h*4;j+=4)
        {
            red = bitPointer[j+2];
            green = bitPointer[j+1];
            blue = bitPointer[j];
            if(red<30 && green>190 && blue>190)
            {
                break;
            }
        }   
    }
    else
    {
        for(int j=0;j<=w*h*4;j+=4)
        {
            red = bitPointer[j+2];
            green = bitPointer[j+1];
            blue = bitPointer[j];
            break;

        }   
    }
    ///RELEASE
    ReleaseDC(NULL,hdc);
    ReleaseDC(NULL,hdcTemp);
    delete []bitPointer; ///Error
}

【问题讨论】:

  • 确切的错误信息..
  • my.exe 0xWHATEVA 中 0xWHATEVA (msvcr110d.dll) 处的未处理异常:访问冲突读取位置 0xWHATEVA 我可以中断或继续。

标签: c++ memory free allocation delete-operator


【解决方案1】:

如果您阅读documentation,您会发现您不应该为bitPointer 分配内存,CreateDIBSection 会为您执行此操作。你需要使用DeleteObject来释放hBitmap2

发生崩溃是因为bitPointer youi 正在释放的值不是您分配的值。 (而且你分配的内存泄露了。)

【讨论】:

  • 谢谢,您的回答对我也有帮助,我能够检测到最后一次泄漏,也谢谢您!
【解决方案2】:

在SelectObject中,保存返回值:HGDIOBJ save = SelectObject(hdcTemp, hBitmap2);

然后在ReleaseDC之前,删除DIBDeleteObject( SelectObject(hdcTemp, save) );

否则,您创建位图而不是删除它们。

【讨论】:

  • 好的,伙计,您的解决方案确实解决了一些问题,但还有另一个问题,它要小得多,但我仍在某个地方不断增加内存。每秒 32 kbits 或类似:D
  • 对 hdcTemp 使用 DeleteDCReleaseDCGetDC 所必需的,而您拥有 CreateCompatibleDC。我希望这是另一个泄漏。
  • 哈,是的,这是一次泄漏,但最后一次泄漏:D 非常小。我希望你能找到它,但你仍然很有帮助! :) 编辑-我想我自己找到了。 BYTEbitPointer=new BYTE[4*hw];
  • 最终删除也将作为delete bitPointer 不带[]。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2021-11-25
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多