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

C++ 从导致AccessViolationException的线程访问文件缓冲区,c++,multithreading,audio,C++,Multithreading,Audio,我有一些wav的声音,我想从线程播放。当程序启动时,我将声音加载到内存中,并使用Windows函数PlaySound播放它们。这是可行的,但是当我尝试播放线程中的声音时,我得到一个AccessViolationException,“试图读取或写入受保护的内存” 有没有办法将文件加载到char数组中,然后从单独的线程读取 下面是我用来加载声音文件并播放它的代码 //将声音从文件加载到char*的代码。 ifstream ifs(WaveSounds::sounds::StartupMusic,i

我有一些wav的声音,我想从线程播放。当程序启动时,我将声音加载到内存中,并使用Windows函数PlaySound播放它们。这是可行的,但是当我尝试播放线程中的声音时,我得到一个AccessViolationException,“试图读取或写入受保护的内存”

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

下面是我用来加载声音文件并播放它的代码

//将声音从文件加载到char*的代码。
ifstream ifs(WaveSounds::sounds::StartupMusic,ios::binary | ios::ate);
//ios::ate标志设置文件流
//到末端位置,所以它已经
//ata调用“tellg()”时结束。
if(&std::ios::ios\u base::good)
{		
int length=ifs.tellg();
如果seekg(0,如果beg);
//加载到字符*,“n_StartMusic”。
n_StartMusic=新字符[长度];
如果读取(n_StartMusic,长度);
ifs.close();
}
//从线程播放声音,导致AccessViolationException。
静态void PlaySoundThread()
{		
播放声音((LPWSTR)WaveSounds::n_CurSound,NULL,SND_MEMORY | SND_ASYNC);
}
//方法,该方法设置要播放的声音并启动线程。
void WaveSounds::播放声音(字符*声音)
{		
n_CurSound=声音;
n_hmod=GetModuleHandle(0);
线程^t=gcnew线程(gcnew ThreadStart(PlaySoundThread));
t->IsBackground=true;
t->Start();

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


要修复此更改,请将m_nCurSound=声音更改为m_nCurSound=新字符[255];strcpy(声音、音乐)

是的,就是这样。该文件是在类的初始值设定项中加载的,但是我在测试它时,在调用它的同一个函数中声明了该类的一个实例,因此它将其加载到堆栈而不是堆中。当我声明一个单独的类实例并尝试它时,它工作得很好。新手错误,因为我对C++仍然是新的。谢谢