【问题标题】:My program crashes sometimes when delete is called on one particular pointer当在一个特定的指针上调用 delete 时,我的程序有时会崩溃
【发布时间】:2016-01-09 04:53:06
【问题描述】:

我正在使用 SDL 2 制作应用程序。我最近才开始使用 SDL_Mixer 库,这给我带来了一个问题。如果我的解释似乎含糊不清,请原谅我,因为这个错误非常令人困惑。

有时,当我关闭我的程序时,程序会崩溃。只是有时会发生这种情况。删除部分代码后,我发现导致此问题的行是对Window* 类型指针的简单delete 调用。如果我删除该删除调用,则关闭程序时不会再发生崩溃。需要注意的另一件事是崩溃发生在调用delete 之后,这意味着程序甚至没有进入~Window(),这真的很奇怪。

我注意到的另一件事是,当我从程序开头删除Mix_OpenAudio(...) 调用时,根本不会发生崩溃,无论是否存在删除调用。所以初始化 SDL_Mixer 与崩溃有关,但这只会增加更多的混乱。

我希望有人知道这里可能出现的问题,但如果我的解释过于模糊,那么我会尝试将问题复制到足够小的代码段中,以便我可以在此处发布。我不想将我的整个代码库复制到这个问题上,因为我不希望模组讨厌我。有什么想法吗?

【问题讨论】:

    标签: c++ pointers sdl sdl-2 sdl-mixer


    【解决方案1】:

    在没有看到有问题的代码的情况下,这是我对两个最可能的原因的猜测:

    1. 您的 Window * 指针未初始化或指向非法内存地址。
    2. 通过该指针引用的窗口已被删除,您再次尝试删除它时会崩溃。这往往会在您进入析构函数之前崩溃,因为 Window* 指向的不再是有效内存,并且没有指向析构函数的指针的 vtable。

    【讨论】:

      【解决方案2】:

      这主要是undefined behavior 的一个示例,它是一个特定条件,当达到该条件时,对将会发生什么没有任何具体保证。

      删除无效指针确实是未定义的行为。现在的问题是你必须明白为什么以及何时指向Window 的指针变得无效,一些提示:

      • 指针未初始化
      • 指针已被删除
      • 指针是另一个导致未定义行为的操作的结果(例如取消引用无效指针的成员)
      • 指针存储在本地/堆栈变量中,当您调用delete 时该变量不再有效(因此您实际上根本没有尝试删除正确的指针,例如返回对存储在本地的指针的引用方法中的变量)

      【讨论】:

        【解决方案3】:

        在回答您的问题之前,我必须进行测试,但看起来我的记忆是正确的:如果您在指针上多次调用 delete,您的程序将崩溃。所以我认为你要删除的指针已经被删除了。

        这是我的测试:

        删除后我尝试将 p 设置为 null,如果成功,则执行以下操作。但是如果我注释掉将 p 设置为 null 的部分,如果将​​ p 视为 true,程序就会崩溃。

        在删除指针之前,您需要一种方法来测试并查看指针是否为空。不幸的是,我不知道如何测试指针以查看它是否指向有效数据。我认为一个简单的“如果(指针)”会起作用,但正如您从我的上一张图片中看到的那样,它不起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-18
          • 2012-03-12
          • 2016-03-11
          • 2015-02-17
          • 1970-01-01
          • 2017-05-02
          • 2020-04-06
          • 1970-01-01
          相关资源
          最近更新 更多