有时在一个特定指针上调用delete时,我的程序会崩溃

时间:2016-01-09 04:53:07

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

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

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

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

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

3 个答案:

答案 0 :(得分:0)

如果没有看到相关代码,我可以猜测两个最可能的原因:

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

答案 1 :(得分:0)

这主要是undefined behavior的一个例子,这是一个特殊情况,当达到时,对所发生的事情没有任何具体保证。

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

  • 指针未初始化
  • 指针已被删除
  • 指针是另一个带来未定义行为的操作的结果(比如解除引用无效指针的成员)
  • 指针存储在本地/堆栈变量中,当您调用delete时,该变量无效(因此您根本不会尝试删除正确的指针,例如返回对存储在指针中的指针的引用)来自方法的局部变量)

答案 2 :(得分:0)

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

这是我的测试:Running a simple test with g++

我尝试在删除后将p设置为null,如果成功则执行以下操作。但是,如果我注释掉将p设置为null的部分,则将if处理为p,并且程序崩溃。

enter image description here

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