从导致 AccessViolationException 的线程访问文件缓冲区

Access File buffer from a Thread Causing AccessViolationException

我想从线程中播放一些 wav 声音。我在程序启动时将声音加载到内存中,然后使用 Windows 函数 PlaySound 播放它们。这有效,但是当我尝试从线程播放声音时,我得到一个 AccessViolationException,"Attempted to read or write protected memory"。

有没有办法将文件加载到 char 数组中,然后从单独的线程读取它?

这是我用来加载和播放声音文件的代码。

// Code to load sound from file into char*.
    ifstream ifs(WaveSounds::sounds::StartupMusic, ios::binary | ios::ate);
 // The ios::ate flag sets the filestream
 // to the end position, so it's already
 // ata the end when we call 'tellg()'.
 if (&std::ios::ios_base::good)
 {  
  int length = ifs.tellg();
  ifs.seekg(0, ifs.beg);
  // Load into the Char * , 'n_StartMusic'.
  n_StartMusic = new char[length];
  ifs.read(n_StartMusic, length);
  ifs.close();
 }

// Plays sound from thread, causes AccessViolationException.
static void PlaySoundThread()
{  
 PlaySound((LPWSTR)WaveSounds::n_CurSound, NULL, SND_MEMORY | SND_ASYNC);
}

// Method that sets sound to play and starts thread.
void WaveSounds::Play_Sound(char* sound)
{  
 n_CurSound = sound;
 n_hmod = GetModuleHandle(0);
 Thread^ t = gcnew Thread(gcnew ThreadStart(PlaySoundThread));
 t->IsBackground = true;
 t->Start(); 
}

如果 char* 声音通过 wave.play_sound(&c) 传递到堆栈上的函数中;到线程启动时,c 可能已被删除,因此 m_nCurSound 指向已清除的内存。

修复此更改 m_nCurSound=sound 为 m_nCurSound= new char[255]; strcpy(声音, m_nCurSound);