Mix_PlayMusic 导致内存损坏

Mix_PlayMusic causing memory corruption

我一直在玩我一直在玩的游戏,一旦我添加音乐,它就会在我经常调用的纹理加载代码中开始出现段错误,在它开始播放后的 5-30 秒之间。我能想到的最好的是它是某种内存损坏。经过一周的调试失败(尝试 GFlags pageheap 之类的东西)后,我设法将其缩减为以下代码,但仍然存在问题。

有时,由于渲染器处于错误状态,调用堆栈会出现 SDL2_mixer.dll 段错误,但大多数情况下它会发生在 SDL_CreateTextureFromSurface 调用中。 numTextures 在我的机器上达到 15000-40000 之间(Windows 10 x64,程序编译为 x86)。

我的直觉告诉我,我的环境或代码有问题,而不是 SDL 本身的问题,但我不知所措。任何帮助或见解将不胜感激。

#include <SDL_image.h>
#include <SDL_mixer.h>
#include <cassert>

int main(int argc, char* argv[])
{
    assert(SDL_Init(SDL_INIT_EVERYTHING) == 0);

    SDL_Window * pWindow_ = SDL_CreateWindow(
        "", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0x0);
    assert(pWindow_ != nullptr);

    SDL_Renderer * pRenderer_ = SDL_CreateRenderer(pWindow_, -1, 0);
    assert(pRenderer_ != nullptr);

    assert(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 512) == 0);

    Mix_Music * pMusic = Mix_LoadMUS("sounds/tranquility.wav");
    assert(pMusic != nullptr);
    assert(Mix_PlayMusic(pMusic, -1) == 0);

    SDL_Surface * pSurface = IMG_Load("images/caution.png");
    assert(pSurface != nullptr);
    SDL_Texture * pTexture = SDL_CreateTextureFromSurface(pRenderer_, pSurface);
    assert(pTexture != nullptr);

    int numTextures = 0;
    while (true)
    {
        numTextures += 10;
        assert(pTexture != nullptr);
        SDL_DestroyTexture(pTexture);
        pTexture = SDL_CreateTextureFromSurface(pRenderer_, pSurface);
        assert(pTexture != nullptr);
    }
}

原来解决办法是更新到最新版本的SDL(2.0.3 -> 2.0.5)。

我开始使用引擎代码库开发有问题的项目,大约 2 年前我从 SDL 1.2 升级到 2.0,当时最新版本是 2.0.3。

最近加声音和音乐的时候拿了最新的SDL_mixer,没想到把SDL更新到最新的2.0.5

获得 SDL 的最新开发和运行时库(以及 SDL_imageSDL_mixer 的良好措施)后,问题消失了。

我对此并不完全满意。我很惊讶较新的 SDL_mixer 与较旧的 SDL 成功链接,如果它们不兼容的话。此外,我在网上找不到任何暗示任何兼容性问题的资源。因此,我有一种不安的感觉,可能发生了其他事情,升级时偶然解决了这个问题。