C++ Win32 Gdiplus 程序在尝试删除时崩溃 Gdiplus::Bitmap
C++ Win32 Gdiplus program crash trying to delete Gdiplus::Bitmap
基本上,我试图找出 Gdiplus::Bitmap* 是否不为 NULL(或 0)。如果是这样删除它,然后在适当的位置创建一个 "new Gdiplus::Bitmap()"。我正在尝试这样做以防止将来发生任何内存泄漏。
我已经尝试了很多东西,如果我创建位图然后调用 delete,它工作正常(减去 null 检查。)
// private
Gdiplus::Bitmap* last_frame_bmp;
// public
foo::foo() {
if (last_frame_bmp != NULL) { delete last_frame_bmp; }
last_frame_bmp = new Gdiplus::Bitmap(100, 100, PixelFormat32bppPARGB);
}
我所说的崩溃是指程序挂起且无法启动。
有什么想法吗?
好吧,你的测试是错误的 - 如果它为空,你只是删除。在任何情况下,delete
一个空指针都是完全安全的;它没有任何效果,所以如果没有这种情况,你会过得更好。
但是无论如何,没有好的 C++ 代码会显式地执行 delete
;我们有智能指针可以为我们做到这一点。
您的崩溃是因为您在其他地方损坏了内存 - 我认为过于明确 new
和 delete
。
您正在使用 non-initialized 变量。
改为
Gdiplus::Bitmap* last_frame_bmp = nullptr;
它会起作用。
顺便说一句:你调用 GdiplusStartup 来初始化 GDI+ 吗?你必须这样做。
解决方案是在 class 的构造函数中设置 Gdiplus::last_frame_bmp = NULL
。它现在按预期工作。
基本上,我试图找出 Gdiplus::Bitmap* 是否不为 NULL(或 0)。如果是这样删除它,然后在适当的位置创建一个 "new Gdiplus::Bitmap()"。我正在尝试这样做以防止将来发生任何内存泄漏。
我已经尝试了很多东西,如果我创建位图然后调用 delete,它工作正常(减去 null 检查。)
// private
Gdiplus::Bitmap* last_frame_bmp;
// public
foo::foo() {
if (last_frame_bmp != NULL) { delete last_frame_bmp; }
last_frame_bmp = new Gdiplus::Bitmap(100, 100, PixelFormat32bppPARGB);
}
我所说的崩溃是指程序挂起且无法启动。
有什么想法吗?
好吧,你的测试是错误的 - 如果它为空,你只是删除。在任何情况下,delete
一个空指针都是完全安全的;它没有任何效果,所以如果没有这种情况,你会过得更好。
但是无论如何,没有好的 C++ 代码会显式地执行 delete
;我们有智能指针可以为我们做到这一点。
您的崩溃是因为您在其他地方损坏了内存 - 我认为过于明确 new
和 delete
。
您正在使用 non-initialized 变量。
改为
Gdiplus::Bitmap* last_frame_bmp = nullptr;
它会起作用。
顺便说一句:你调用 GdiplusStartup 来初始化 GDI+ 吗?你必须这样做。
解决方案是在 class 的构造函数中设置 Gdiplus::last_frame_bmp = NULL
。它现在按预期工作。