【问题标题】:C++ Win32 Gdiplus program crash trying to delete Gdiplus::BitmapC++ Win32 Gdiplus 程序崩溃试图删除 Gdiplus::Bitmap
【发布时间】:2016-01-04 07:44:27
【问题描述】:

基本上,我试图找出 Gdiplus::Bitmap* 是否不为 NULL(或 0)。如果是这样删除它,然后在适当位置创建一个“新 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);
}

我的意思是,程序挂起并且无法启动。

有什么想法吗?

【问题讨论】:

  • 为什么是Gdiplus::last_frame_bmp 而不仅仅是last_frame_bmp
  • @AlanStokes 错误,复制和粘贴时出现了一些错误,代码现在是这样的。

标签: c++ gdi+


【解决方案1】:

好吧,你的测试是错误的——你只有在它为空时才删除。在任何情况下,delete 一个空指针是完全安全的;它没有任何效果,所以完全没有这种情况会好得多。

但是无论如何,没有好的 C++ 代码会明确地使用delete;我们有智能指针可以为我们做到这一点。

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

【讨论】:

  • 那是我的错,我在测试,原来是!=。创建位图的那部分实际上只运行一次。但我只是想检查一下它的真面目。现在让我感到困扰的是,这正在停止程序。我还解决了另一个问题。
  • 在兑现de!ete之前,您仍然不需要检查null。好的 C++ 代码几乎从不使用 delete - 或者实际上是 new
  • @EvanCarslake 你确定last_frame_bmp 在你尝试删除它之前已经被初始化了吗?你的代码没有显示它被设置为任何东西,所以它很可能有一个随机值(不指向一个有效的对象),然后你尝试删除它。您应该在需要使用变量的地方声明;那么你就不会有这个问题了。
  • @KlitosKyriacou 它尚未初始化,我希望这可以通过与 NULL 的比较进行检查,如果没有则创建它。现在想,那不应该/不会起作用。
【解决方案2】:

您正在使用未初始化的变量。

改成

Gdiplus::Bitmap* last_frame_bmp = nullptr;

它会起作用的。

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

【讨论】:

  • 明确声明它是全局的,因此初始化为零。在任何情况下,声明和delete之间都有未指定的代码。
  • @AlanStokes C++ 没有明确的“全局”声明。有静态存储类,但不是静态的。
  • @c-smile 好吧,我更新了代码以更符合上下文。问题将来自未初始化。由于它的位置,我无法在那里初始化它。如果我之前初始化它确实有效。
  • 称为命名空间范围。尽管事实证明 OP 无论如何都不准确。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2019-01-03
    • 2010-12-28
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多