GDI+ 中 delete 陷阱
来源:互联网 发布:ssh三大框架书籍知乎 编辑:程序博客网 时间:2024/06/10 04:20
有时delete GDI+类型的对象会报错.
例如
Bitmap * pBitmap = new Bitmap;
...
delete pBitmap;
正常来说是不会错误的.
但是要确保在 GdiplusShutdown(gdiplusToken)之前delete.
那当然了.
但是容易出现陷阱, 例如下面代码
// 这是VC基于Dialog的工程, 一般都是按照下面的格式使用GDI+, 在CTestDlg中就用到GDI+的各种类.
BOOL CTestApp::InitInstance()
{
…
// GDI+ 初始化
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
CTestDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此处放置处理何时用“确定”来关闭
// 对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
// 对话框的代码
}
//关闭gdiplus的环境
GdiplusShutdown(gdiplusToken);
// 由于对话框已关闭,所以将返回FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
问题就出在CTestDlg中的GDI+的使用.
假设你在CTestDlg的构造函数中new一个GDI+对象.
你大多数会在CTestDlg的析构函数中把该GDI+对象中delete.
问题就来了.
CTestDlg的析构函数是什么时候被调用的.
在 BOOL CTestApp::InitInstance()的return FALSE 之后.
但析构CTestDlg之前 GdiplusShutdown(gdiplusToken);已经被调用了
此时delete GDI+的对象就会报错.
简单解决方法
BOOL CTestApp::InitInstance() { … // GDI+ 初始化 GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); { CTestDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此处放置处理何时用“确定”来关闭 // 对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用“取消”来关闭 // 对话框的代码 } } //关闭gdiplus的环境 GdiplusShutdown(gdiplusToken); // 由于对话框已关闭,所以将返回FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }
- GDI+ 中 delete 陷阱
- delete和delete[]陷阱
- C++ delete陷阱
- GDI:deleteObject,delete and detach()
- 多线程多核的delete陷阱
- C++中delete和delete[]
- c++中delete和delete[]
- C++中delete 与 delete[]
- VS2008中使用GDI+
- vc中gdi+安装
- VS2008中使用GDI+
- VS2008中使用GDI+
- VC中使用GDI+
- GDI+中Font创建
- VC6 中使用GDI+
- VS2008中配置GDI+
- VS2010中GDI+配置
- VS2010中GDI+配置
- void指针
- //让 Edit 只接受数字
- Null value was assigned to a property of primitive type setter
- 自选图形的艺术组合——圆形
- MFC中获得文件夹路径的方法
- GDI+ 中 delete 陷阱
- VC++中打开文件和保存文件对话框的调用
- 停止担忧.
- Setting up MaNGOS
- slice
- 2010年终总结,2011年初忠告只想对自己说一句话
- C++虚函数表解析(转)
- poj 3259 Wormholes(SPFA || Bellman-Ford)
- vb base64支持中文版