从窗口的额外字节泄漏内存?

时间:2011-08-30 11:42:23

标签: c++ winapi memory memory-leaks

我正在创建一个窗口C ++类,并且在注册窗口类时,我为每个创建的窗口使用额外的字节(使用WNDCLASSEX结构的cbWndExtra等)。 是:: DestroyWindow(..)释放分配窗口的额外字节吗?

似乎当我在循环中创建并销毁许多窗口对象时,任务管理器中我的应用程序的“提交大小”会上升。

我的C ++类没有分配任何内存,而且它上面没有控件/工具栏/菜单,它似乎没有泄漏任何GDI对象或类似的东西,所以我怀疑它是带有额外字节的窗口。

有没有人对可能出现的问题有任何想法?

我应该调用一些API来释放额外的字节吗?

在销毁使用额外字节的窗口时,还有其他必须做的事吗?

编辑: 我确实尝试只创建一个特定类的窗口,该窗口使用额外的字节并在循环中销毁它,同样,我的应用程序的提交大小也会增加。我也等了几个小时,提交大小根本没有减少。 额外字节仅包含指向表示窗口的对象的指针。该对象被破坏(它在循环中静态创建)。 无论如何,它似乎不是我的错,它甚至可能不是Windows的错误(正如你所说 - 虽然我不是100%肯定)所以我就要保持原样......

2 个答案:

答案 0 :(得分:5)

是的,它会释放额外的字节。也许你正在存储指向已分配内存的指针,这就是泄漏。

此外,“提交大小”不会下降并不能证明内存泄漏。分配器不会立即将释放的内存返回给操作系统,它们可以保留并稍后重用。尝试创建一个简单的CreateWindowEx / DestroyWindow无限循环来验证。

答案 1 :(得分:0)

通过设置cbWndExtra字段释放您引用的所有内存是您的职责。如果您考虑一下这是有道理的,因为Windows首先不知道您如何分配内存(例如malloc,new,LocalAlloc等)

编辑:因为我有一个downvote也许我不清楚。如果你将指针插入字段并指向你在应用程序中分配的内容,那么该内存将不会被释放。额外的字节将是,但不是他们指向的。