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;我们有智能指针可以为我们做到这一点。

您的崩溃是因为您在其他地方损坏了内存 - 我认为过于明确 newdelete

您正在使用 non-initialized 变量。

改为

Gdiplus::Bitmap* last_frame_bmp = nullptr;

它会起作用。

顺便说一句:你调用 GdiplusStartup 来初始化 GDI+ 吗?你必须这样做。

解决方案是在 class 的构造函数中设置 Gdiplus::last_frame_bmp = NULL。它现在按预期工作。