Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时使用释放方法?_C++_Winapi_Mixer - Fatal编程技术网

C++ 何时使用释放方法?

C++ 何时使用释放方法?,c++,winapi,mixer,C++,Winapi,Mixer,我正在创建一个“混音器”应用程序,用于控制音频会话和端点的音量。我的问题是,在IMMDevice上调用Release方法是否会使以前获取的IAudioEndpointVolume引用无效?在我的程序中,它看起来像这样: IMMDevice *device; IMMDeviceEnumerator *deviceEnumerator; IMMDeviceCollection *deviceCollection; IAudioEndpointVolume *audioEndpoint; ... /

我正在创建一个“混音器”应用程序,用于控制音频会话和端点的音量。我的问题是,在
IMMDevice
上调用
Release
方法是否会使以前获取的
IAudioEndpointVolume
引用无效?在我的程序中,它看起来像这样:

IMMDevice *device;
IMMDeviceEnumerator *deviceEnumerator;
IMMDeviceCollection *deviceCollection;
IAudioEndpointVolume *audioEndpoint;

... // Initializing device, deviceEnumerator and deviceCollection

// for cycle {
    ...
    deviceCollection->Item(i, &device);
    device->Activate(IID_IAudioEndpointVolume, CLSCTX_ALL, NULL, (void**)&audioEndpoint);
    device->Release();  // Will this cause UB in the next line?
    audioEndpoint->GetMasterVolume(&volume);
    ...
//}

我应该使用这样的发布方法还是在发布<代码> AudioEndot?< /P>我建议使用微软来使用C++中的Winapi。它有RAII句柄、错误代码到异常转换以及一些其他小工具。@IInspectable它不回答这个问题,但仍然会有帮助,这就是为什么我对它做了评论而不是回答:)@IInspectable否,但是我建议C++中使用C风格的资源管理来代替C++资源管理。这与理解上述管理是如何实现的是完全正交的,所以我不确定你的观点到底是什么。理论上,你可以(必须)在需要时调用Release。在实践中,我看到一些(罕见的)写得不好的对象崩溃,因为它们内部存在一些层次结构的ref问题。