欣赏下面一段程序,你认为能正常运行吗?
#include "stdafx.h"
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;
int _tmain(int argc, _TCHAR* argv[])
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
Matrix m;
m.Translate(2.0, 3.0);
PointF p(2.0, 3.0);
m.TransformPoints(&p);
GdiplusShutdown(gdiplusToken);
return 0;
}
调试的时候,一直到return都是正常的,就在Matrix析构的时候挂了,百思不得其姐啊。想想算了,还是自己释放吧,干脆就放在GdiplusShutdown前面吧,放在最后也是不行的,这个有点晦涩呀。修改为如下就正常了:
#include "stdafx.h"
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;
int _tmain(int argc, _TCHAR* argv[])
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
Matrix *m = new Matrix();
m->Translate(2.0, 3.0);
PointF p(2.0, 3.0);
m->TransformPoints(&p);
delete m;
GdiplusShutdown(gdiplusToken);
return 0;
}
You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.
You can call GdiplusStartup on one thread and call GdiplusShutdown on another thread as long as you delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.
Do not call GdiplusStartup or GdiplusShutdown in DllMain or in any function that is called by DllMain. If you want to create a DLL that uses GDI+, you should use one of the following techniques to initialize GDI+:
Require your clients to call GdiplusStartup before they call the functions in your DLL and to call GdiplusShutdown when they have finished using your DLL.
Export your own startup function that calls GdiplusStartup and your own shutdown function that calls GdiplusShutdown. Require your clients to call your startup function before they call other functions in your DLL and to call your shutdown function when they have finished using your DLL.
Call GdiplusStartup and GdiplusShutdown in each of your functions that make GDI+ calls.
Warning For info about how to use dynamic data exchange (DDE) with GDI+, see Special CWinApp Services.