gpt4 book ai didi

C++ `if` 似乎走错了分支?

转载 作者:行者123 更新时间:2023-11-30 05:05:33 29 4
gpt4 key购买 nike

我正在为一个毫无意义的 if 语句而苦苦挣扎......

在 C++ 文件中考虑这段代码

if (coreAudioDevice) {
delete coreAudioDevice;
coreAudioDevice = nullptr;
}
coreAudioDevice = AudioDevice::GetDevice(defaultOutputDeviceID, false, coreAudioDevice, true);
if (coreAudioDevice)
{
coreAudioDevice->setDefaultDevice(true);
// we use the quick mode which skips initialisation; cache the device name (in AudioDevice)
// using an immediate, blocking look-up.
char devName[256];
coreAudioDevice->GetName(devName, 256);

AUDINFO ("Using default output device %p #%d=\"%s\".\n",
defaultOutputDeviceID, coreAudioDevice, coreAudioDevice->GetName());
}
else
AUDERR ("Failed to obtain a handle on the default device (%p)\n", coreAudioDevice);

调用 ObjC++ 文件中的函数:

AudioDevice *AudioDevice::GetDevice(AudioObjectID devId, bool forInput, AudioDevice *dev, bool quick)
{
if (dev) {
if (dev->ID() != devId) {
delete dev;
} else {
return nullptr;
}
}
dev = new AudioDevice(devId, quick, forInput);
return dev;
}

这导致以下终端输出:

ERROR coreaudio.cc:232 [init]: Failed to obtain a handle on the default device (0x7f81a1f1f1b0)

显然 if 不应该失败,因为 coreAudioDevice 应该是 NULL,然后在 else 分支中为这个变量打印一个非空值。

我尝试了不同的编译器选项和不同的编译器(clang 4.0.1 与 5.0.1),显然我的代码中确实有些可疑。有什么想法吗?

最佳答案

在没有返回值的情况下到达函数末尾是 C++ 中的未定义行为。

参见 http://en.cppreference.com/w/cpp/language/ubWhat are all the common undefined behaviours that a C++ programmer should know about? .

因此调用 setDefaultDevice() 可以合法地产生任何结果。当程序的控制流导致未定义的行为(即调用 setDefaultDevice())时,编译器可以自由地将程序编译成可以执行任何操作的可执行文件。

在这种情况下,输入 if block 且 coreAudioDevice 非零会导致 UB。所以优化编译器预见到这一点,然后选择让它进入 else 分支。像这样,它可以完全删除第一个分支和 if,以生成更优化的代码。

参见 https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633

如果不进行优化,程序应该可以正常运行。

关于C++ `if` 似乎走错了分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48287328/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com