2010-07-28 3 views
4

Un programme très simple je pourrais dire ..violation d'accès dans l'image destructor

#include <windows.h> 
#include <gdiplus.h> 

using namespace Gdiplus; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR cmdLine, int nShow){ 
    // Gdiplus variables 
    GdiplusStartupInput mGdiplusStartupInput; 
    ULONG_PTR   mGdiplusToken; 
    GdiplusStartup(&mGdiplusToken, &mGdiplusStartupInput, NULL); 

    Bitmap bitmap(L"left.bmp"); 


    GdiplusShutdown(mGdiplusToken); 
    return 0; 
} 

Lorsque vous exécutez cet exemple, je reçois une violation d'accès à GdiplusBitmap.h dans cette fonction

inline 
Image::~Image() 
{ 
    DllExports::GdipDisposeImage(nativeImage); 
} 

En supprimant la appel à Bitmap bitmap(L"left.bmp"); tout fonctionne bien .. J'ai essayé de trouver un exemple simple sur msdn (par exemple quelque part près de la Bitmap constructor, mais n'a rien trouvé.)

Qu'est-ce qui me manque?

Répondre

8

L'instance Bitmap que vous avez créée est hors de portée APRES l'appel à l'arrêt de GDI +. Donc, quand le Bitmap est détruit, il ne peut pas appeler la méthode donnée GdipDisposeImage.

L'erreur devrait disparaître si vous vous assurez que bitmap est supprimé avant d'arrêter GDI +.

+4

+1 cela. Ajouter une paire de parenthèses autour de l'image bitmap pour le forcer hors de portée, ou en faire un type de pointeur (moche). –

+0

Cela a du sens. Mais comment est-ce que je détruis explicitement un bitmap qui est créé sur la pile? – Default

+0

@Mike: sorte de bloc de portée autour de l'appel Bitmap .. Cela a effectivement résolu. sweet :) Merci pour les réponses rapides – Default