-2

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

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

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

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

4

3 回答 3

0

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

这是我的测试:使用 g++ 运行一个简单的测试

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

在此处输入图像描述

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

于 2016-01-09T05:05:34.080 回答
0

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

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

这主要是未定义行为的示例,这是一种特定条件,当达到该条件时,对将发生的情况没有任何具体保证。

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

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