【问题标题】:freeing pwfx after waveOutOpen throws在 waveOutOpen 抛出后释放 pwfx
【发布时间】:2019-01-25 15:23:26
【问题描述】:

根据微软documentation: “您可以在将这个 [pwfx] 结构传递给 waveOutOpen 后立即释放它。”

但这段代码似乎不同意:

pwfx=new WAVEFORMATEX;
pwfx->wFormatTag=WAVE_FORMAT_PCM;
pwfx->nChannels=2;
pwfx->nSamplesPerSec=SPS;
pwfx->nAvgBytesPerSec=SPS*2;
pwfx->nBlockAlign=2;
pwfx->wBitsPerSample=8;
mmres=waveOutOpen(&ghwo,uDeviceID,pwfx,dwCallback,dwCallbackInstance,fdwOpen);
delete pwfx;

【问题讨论】:

    标签: winapi waveout


    【解决方案1】:

    你不需要newdelete 任何东西。你可以这样做:

    WAVEFORMATEX wfx = { };
    wfx.wFormatTag=WAVE_FORMAT_PCM;
    ...
    mmres=waveOutOpen(&ghwo,uDeviceID,&wfx,dwCallback,dwCallbackInstance,fdwOpen);
    

    这有帮助吗?

    【讨论】:

    • 我可以,但这并不能回答我的问题。还是谢谢
    • 然后,正如@DavidHeffernan 所说,问题一定出在其他地方。另外,发布文字而不是图片。谢谢。
    • API 可以与结构末尾的附加数据一起使用,这就是文档描述释放结构的原因。在那种情况下,在堆上分配是很常见的。当然这不是这里的场景。
    【解决方案2】:

    我在您提供的代码中看到的唯一问题是您没有完全初始化结构。您没有初始化 cbSize,在这种情况下必须将其设置为 0

    鉴于您没有在此结构的末尾分配任何额外数据,因此无需在堆中分配它。

    问题出在您传递给函数的其他参数上,这完全有可能。我们看不到他们的任何细节,因此无法发表评论。

    【讨论】:

    • 在这种情况下,我猜问题出在我们看不到的代码中。
    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 2013-07-29
    • 2012-09-29
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多