Я не могу управлять памятью для объектов Bitmap и CLSID, которые я создал в классе объектов снимка экрана.Оба они из библиотеки GDI +.В заголовке перечислены следующие закрытые переменные в Screenshot.h
#include <gdiplus.h>
#include <iostream>
#include <fstream>
#include <string>
#include "windows.h"
#pragma once
#pragma comment(lib, "gdiplus.lib")
using namespace std;
using namespace Gdiplus;
class Screenshot
{
private:
HDC dc, memdc, fontdc;
HBITMAP membit;
Bitmap* bmpPtr;
CLSID clsid;
ULONG_PTR gdiplusToken;
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid);
public:
Screenshot();
~Screenshot();
void TakeScreenshot(string userAction, string winName, long xMousePos, long yMousePos, long long tStamp);
void SaveScreenshot(string filename);
void memoryManagement();
};
Затем, когда моя основная программа делает снимок экрана, значения заполняются TakeScreenshot (), но еще не сохраняются на диск
* 1005.*
Если скриншот сохранен, другая функция SaveScreenshot () использует bmpPtr-> Save () и внутри него вызывается отключение Gdiplus.Однако некоторые снимки экрана выводятся из очереди (очередь STL) и не сохраняются в памяти, а следующим образом:
void ManageQueue(Screenshot& ssObj)
{
//If queue contains 30 screenshots, pop off first element and push new object
//Else just push new object
if (screenshotQueue.size() == MAX_SCREENSHOTS)
{
screenshotQueue.front().memoryManagement();
screenshotQueue.pop();
screenshotQueue.push(ssObj);
}
else
{
screenshotQueue.push(ssObj);
}
}
Я написал функцию MemoryManagement () для выполнения необходимых выпусков и удалений.до снятия скриншота.Эта функция не вызывается, если снимок экрана был сохранен:
void Screenshot::memoryManagement()
{
delete bmpPtr;
delete &clsid;
ReleaseDC(NULL, memdc);
DeleteObject(fontdc);
DeleteObject(memdc);
DeleteObject(membit);
}
Когда вызывается либо удаление из bmpPtr, либо из clsid, будь то из этой функции или из деконструктора, программа аварийно завершает работу.Я испытываю значительные утечки памяти с программой сейчас и без запуска эквивалента Windows Valgrind, я предполагаю, что это происходит отсюда.Как я могу успешно удалить эти объекты?Я буду отмечать любой ответ в моем исходном коде как программист.Пожалуйста, оставьте любые предложения по улучшению моего вопроса, если это необходимо.