在研究这个问题时,我在网上发现了以下场景的多个提及,总是作为编程论坛上未解答的问题.我希望在此发布此内容至少可以记录我的发现.
首先,症状:在运行使用waveOutWrite()输出PCM音频的相当标准代码时,我有时会在调试器下运行时得到这个:
ntdll.dll!_DbgBreakPoint@0()
ntdll.dll!_RtlpBreakPointHeap@4() + 0x28 bytes
ntdll.dll!_RtlpValidateHeapEntry@12() + 0x113 bytes
ntdll.dll!_RtlDebugGetUserInfoHeap@20() + 0x96 bytes
ntdll.dll!_RtlGetUserInfoHeap@20() + 0x32743 bytes
kernel32.dll!_GlobalHandle@4() + 0x3a bytes
wdmaud.drv!_waveCompleteHeader@4() + 0x40 bytes
wdmaud.drv!_waveThread@4() + 0x9c bytes
kernel32.dll!_BaseThreadStart@8() + 0x37 bytes
Run Code Online (Sandbox Code Playgroud)
虽然明显的嫌疑人会在代码中的其他地方出现堆损坏,但我发现事实并非如此.此外,我能够使用以下代码重现此问题(这是基于对话框的MFC应用程序的一部分:)
void CwaveoutDlg::OnBnClickedButton1()
{
WAVEFORMATEX wfx;
wfx.nSamplesPerSec = 44100; /* sample rate */
wfx.wBitsPerSample = 16; /* sample size */
wfx.nChannels = 2;
wfx.cbSize = 0; /* size of _extra_ info */
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels;
wfx.nAvgBytesPerSec = wfx.nBlockAlign …Run Code Online (Sandbox Code Playgroud)