Итак, у меня есть программа, которая извлекает случайные изображения из папки и создает из них коллаж и устанавливает его на обои Windows. Кажется, что все работает нормально. Поэтому я подумал, что поставлю таймер сна и дам ему автоматически обновить себя, без необходимости запускать его каждые полчаса или когда-либо. Я сделал это, и он отлично работает, но я столкнулся с проблемой утечки памяти, которая не была замечена, прежде чем я начал зацикливать ее. Я пытаюсь избавиться от объектов GDI +, но я продолжаю получать ошибку, которую выставлять, не является членом GDIplus :: Imagedispose не является членом класса GDI + Image
Я загружаю изображение в объект изображения, а затем меняю его размер и помещаю в массив изображений, то я хотел бы избавиться от первого изображения. Затем я хотел бы избавиться от массива после того, как я закончу работу с изображениями в нем.
Это делается со старой копией VS2005.
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
#include <string>
#include <iostream>
#include <vector>
#include <dirent.h>
#include <time.h>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include "cwp05rnd.h"
using namespace Gdiplus;
using namespace std;
#pragma comment (lib,"Gdiplus.lib")
#pragma comment (lib, "user32.lib")
int main()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
HDC hdc;
Graphics graphics(hdc);
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
CLSID jpegClsid;
GetEncoderClsid(L"image/jpeg", &jpegClsid);
SetCurrentDirectoryA("E:\\Photos");
ofstream outfile;
outfile.open ("outimgs.txt");
ofstream outfile2;
outfile2.open("imgpos.txt");
srand(time(NULL));
init_genrand(time(NULL));
vector<string> dirlist;
DIR *d;
struct dirent *dir;
int i=0;
d=opendir(".");
if (d)
{
while ((dir=readdir(d)) != NULL)
{
i++;
dirlist.push_back(dir->d_name);
}
closedir(d);
}
Image wp(L"E:\\Dropbox\\Photos\\wallpaper.jpg");
Graphics* wpimage = Graphics::FromImage(&wp);
int r;
int rvsize=100;
int rv[100]={0};
string img;
std::wstring wimg;
const wchar_t* rimg;
double cwidth;
double cheight;
double ratio;
int nheight;
int counter=0;
int full = 0;
int tries = 0;
int hfull = 0;
int imgnum =0;
int last=0;
Image* newpic[10];
while (tries <10)
{
redo:
tries++;
int newrv=0;
while (newrv ==0)
{
r=genrand_int32()%i;
for (int k=0; k < rvsize; k++)
{
if (rv[k] > 0 && rv[k]==r)
{
break;
}
if (rv[k]==0 && r < i)
{
newrv =1;
rv[k]=r;
last=k;
break;
}
if (rv[k] ==0)
{
break;
}
}
}
img = dirlist[r];
if (img[0]=='.')
{
newrv=0;
goto redo;
}
wimg = std::wstring(img.begin(),img.end());
rimg = wimg.c_str();
Image pic(rimg);
cwidth = pic.GetWidth();
cheight = pic.GetHeight();
if (cheight ==0)
{
outfile2 << "error" << img << endl;
rv[last]=0;
system("pause");
goto redo;
}
ratio = cwidth/cheight;
nheight = nwidth/ratio;
pic.RotateFlip(Rotate180FlipNone);
pic.RotateFlip(Rotate180FlipNone);
newpic[imgnum] = pic.GetThumbnailImage(nwidth,nheight,NULL,NULL);
delete pic[0];
imgnum = imgnum + 1;
}
, то есть длинный участок переворачивается и вращается на изображение в newpic, в соответствии с различными случайными значениями.
wpimage->DrawImage(newpic[k],(j*nwidth),(((k+1)*whitespace)+htot),nwidth,nh[k]);
wp.Save(L"C:\\Temp\\wallpaper\\nwallpaper.jpg", &jpegClsid, NULL);
delete newpic;
setWall();
delete wpimage;
delete wp;
return 0;
}
При попытке удалить объекты изображения, я получаю сообщение об ошибке: либо он не может удалить объекты, которые не являются указателями, или он не может конвертировать из GDIplus :: Изображение к мочеиспусканию *
Любой совет будет оценен.
это не большой фрагмент кода. Язык C++/CLI намеренно скрывает интерфейс IDisposable. Он принял семантику C++, вместо этого вы используете оператор * delete *. Таким образом, это просто 'delete newpic [0];' Если вы опустите^шляпу, как вы делали с pic, тогда компилятор автоматически генерирует ее, подобно RAII. –
Это дает мне необъявленные ошибки идентификатора, что кажется странным, поскольку оно объявлено. И да, я знаю, что фрагмент кода не очень хорош, но я не думал, что все флипсы и вращения необходимы, и цикл просто зацикливается через imgnum. – user2207973
Опубликовать реальный код, я ничего не могу с этим беспорядком. –