为什么我的 PictureBox 加载例程会泄漏内存?
-
21-09-2019 - |
题
我去过 尝试在 C++/CLI 应用程序中交换 PictureBox 中的图像 但我的解决方案似乎存在内存泄漏:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
// Pick a new bitmap
static int resource = IDB_BITMAP1;
if( resource == IDB_BITMAP2)
{
resource = IDB_BITMAP1;
}
else
{
resource = IDB_BITMAP2;
}
// Get the primary module
Module^ mod = Assembly::GetExecutingAssembly()->GetModules()[0];
// Get the instance handle
IntPtr hinst = Marshal::GetHINSTANCE(mod);
// Get the bitmap as unmanaged
HANDLE hbi = LoadImage((HINSTANCE) hinst.ToPointer(),MAKEINTRESOURCE(resource),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
// Import the unmanaged bitmap into the managed side
Bitmap^ bi = Bitmap::FromHbitmap(IntPtr(hbi));
// Remove any previously stored images
if(m_pictureBox1->Image != nullptr)
{
delete m_pictureBox1->Image;
m_pictureBox1->Image = nullptr;
}
// Insert the bitmap into the picture box
m_pictureBox1->Image = bi;
// Free up the unmanaged bitmap
DeleteObject(hbi);
}
据我所知,我明确释放了内存,那么为什么每次单击按钮时任务管理器都会报告内存增加约 24k?
解决方案
两个字:垃圾收集
其他提示
奇怪的是,这实际上看起来是当您将鼠标悬停在按钮上时引起的。每次执行此操作时,内存都会跳跃,但经过足够多的鼠标悬停后,内存使用量就会稳定下来。按钮的实际点击次数(即调用我的例程)不会导致任何泄漏。
不隶属于 StackOverflow