在我的代码中,我有一个 SoundManager 类,它包含并操作我的游戏的所有声音。这个类需要被实例化,它的方法被多个其他类调用。但是我希望只有一组声音占用内存,所以为了提高效率,所有资产都被声明为静态 shared_ptrs。
#include "SoundManager.h"
static shared_ptr<ISoundEngine> sEngine;
static shared_ptr<ISoundSource> hoverSound;
static shared_ptr<ISoundSource> confirmSound;
static shared_ptr<ISoundSource> mainBGM;
static shared_ptr<ISound> bgmInterface;
SoundManager::SoundManager(void)
{
//first we need to create the irrKlang sound engine instance
if(!sEngine)
{
sEngine.reset(createIrrKlangDevice());
}
if(!hoverSound)hoverSound.reset(sEngine->addSoundSourceFromFile("Sounds/ButtonHover.mp3"));
if(!confirmSound)confirmSound.reset(sEngine->addSoundSourceFromFile("Sounds/ButtonConfirm.mp3"));
if(!mainBGM)mainBGM.reset(sEngine->addSoundSourceFromFile("Sounds/mainBGM.mp3"));
//set some default volumes
hoverSound->setDefaultVolume(1.0f);
confirmSound->setDefaultVolume(0.4f);
mainBGM->setDefaultVolume(0.5f);
}
SoundManager::~SoundManager(void)
{
}
这个 SoundManager 在我的 main() 函数中实例化,每次我需要加载标题屏幕(SoundManager 也在这个标题屏幕类中实例化)。一遍又一遍地初始化和销毁标题屏幕不会导致问题。静态 shared_ptrs 对象不会被销毁,因为它们仍在被 SoundManager 的主要功能实例使用。
现在这一切在实践中运行我的游戏都很好。然而,当谈到干净地退出时,当上面的静态对象被拆除时,未处理的运行时异常(访问冲突)被抛出给我。使用 VS2012 的调试器将我指向 memory.h 中的一行。
private:
virtual void _Destroy()
{ // destroy managed resource
delete _Ptr; <<<<<<<<<The debugger points to this line
}
我的理解是,与 obj-c 类似,c++ shared_ptrs 使用引用计数器来确保对象不会被删除,直到不再存在需要使用它们的对象。我不明白是什么导致了这些错误。
也许我不应该省略一个重要部分:我的游戏是通过调用 exit(0) 退出的;尽可能靠近 main() 函数。在这样做之前,我没有采取任何行动来清理 SoundManagers 成员,因为我认为 shared_ptr 已经处理了这个问题。
有人知道是什么导致我的清理问题吗?