关于DeleteObject()释放资源
来源:百度知道 编辑:UC知道 时间:2024/05/28 10:41:29
HBRUSH hbrush = CreateSolidBrush(RGB(255, 0, 0));
if (::DeleteObject(hbrush) == 0)
MessageBox(L"资源释放失败");
这该是没问题的,但发现内存还是一直在上升,最小化后内存又从小慢慢增大,不知道是哪里出错了,望高手指教!!~谢谢。
对不起大家,上面的代码确实不会,但以下代码却会,这也是在OnTimer的定时器代码 我选用的图片都比较大
const int BACK = IDB_BITMAP2;//图片的基址
const int NUM = 8;//资源图片数量
int i;
srand((unsigned long)time(NULL));
i = rand() % NUM;
HBITMAP hbitmap = LoadBitmap(::AfxGetInstanceHandle()
,MAKEINTRESOURCE(BACK+i));
if (DeleteObject( hbitmap) == 0)
MessageBox(L"d");
LoadBitmap的释放是不是不一样啊。 这是我新建的一个项目,用来调试的,就这么多代码和资源图。可是仍然有问题。如果谁知道原因,告诉我邮箱,发给他看看。 刚用DevPartner检测上面的代码确实有资源的泄露!
我详细看了你的程序,是这样的,其实内存并没有增加,你看起来好象是增加了,是因为你有N个图,你每次调用函数就读入一张。
其实你可以在程序初始化时使用
LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));
LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP3));
........
LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP9));
LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP10));
这样一次性把图都读一遍,然后不管你在定时器里怎么LOAD都没关系了,内存也不会增加1K的
你知道我的意思吗?
就是说每LOAD一次新图,内存才会增加。旧图是不会增加的。这是很正常的,也是为了程序性能考虑的。要不然每次LOAD都要读硬盘,再释放下次用又要读硬盘,又慢又伤硬盘的。
虽然不是很清楚,但是可以提个建议:
检查一下释放的是不是自己创建的hobject,
比如 HBRUSH hbrush = CreateSolidBrush(RGB(255, 0, 0));
然后有可能 hbrush = (HBRUSH)SelectObject(hbrush);
最后 DeleteObject(hbrush); 可是清除的不是自己创建的那个obj.
上代码!!!
------------------------------------------
“LoadBitmap读取DLL资源”逻辑
和
“HBITMAP hbitmap = LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(BACK+i));”代码
不相符
改为:
HBITMAP hbitmap = LoadBitmap(::Ge