2013-09-13 3 views
0

Итак, у меня есть программа, которая извлекает случайные изображения из папки и создает из них коллаж и устанавливает его на обои 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 :: Изображение к мочеиспусканию *

Любой совет будет оценен.

+0

это не большой фрагмент кода. Язык C++/CLI намеренно скрывает интерфейс IDisposable. Он принял семантику C++, вместо этого вы используете оператор * delete *. Таким образом, это просто 'delete newpic [0];' Если вы опустите^шляпу, как вы делали с pic, тогда компилятор автоматически генерирует ее, подобно RAII. –

+0

Это дает мне необъявленные ошибки идентификатора, что кажется странным, поскольку оно объявлено. И да, я знаю, что фрагмент кода не очень хорош, но я не думал, что все флипсы и вращения необходимы, и цикл просто зацикливается через imgnum. – user2207973

+0

Опубликовать реальный код, я ничего не могу с этим беспорядком. –

ответ

0

Я заметил, у вас есть Image pic(rimg); Но вы делаете delete pic[0]; pic не указатель .. не выделяется динамически или что-то ... и не является массивом (или, может быть, это не .. но интуитивно я думаю, что нет ..)

* Добавить * Ах да, если вы уже решили эту проблему, предлагает закрыть вопрос или, по крайней мере, говорить об этом ...

Смежные вопросы