mix_playMusic导致内存损坏

Mix_PlayMusic causing memory corruption

本文关键字:内存 损坏 playMusic mix      更新时间:2023-10-16

我一直在从事的游戏中遇到麻烦,一旦我添加音乐,它就开始在我经常被称为的纹理加载代码中进行segfault,在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链接在一起,我感到非常惊讶。此外,我在网上找不到任何提示任何兼容性问题的资源。因此,我有一种不安的感觉,可能还有其他事情正在发生,这是由升级偶然解决的。