关于DeleteObject()释放资源

来源:百度知道 编辑:UC知道 时间:2024/05/28 10:41:29
在程序运行的时候发现内存一直在上升,自然想到资源泄漏了,程序中用LoadBitmap读取了DLL资源,就反复看代码,发现果然是它,可在程序中我明明中用了DeleteObject()了。 最后发现,还不只是LoadBitmap的问题 ,连简单创建的画刷也会出现此问题,用定时器控制以下代码:
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