BING AI 的答案, 修改对了,但是原因解释错了。
这段代码中的问题在于,你试图将一个临时对象(由三元运算符产生)的引用赋值给一个字符串引用。这是不被允许的,因为临时对象在表达式结束后就会被销毁,而引用仍然指向那块已经被销毁的内存。你可以通过去掉引用来解决这个问题。修改后的代码如下:
void getRelayTuple(bool destinationIsPrivate,
bool destV4,
int64_t& serverId,
voice::Tuple& relayTuple)
{
serverId = mServerId;
std::string address4 = destinationIsPrivate ? mPrivateServerIp4 : mPublicServerIp4;
std::string address6 = destinationIsPrivate ? mPrivateServerIp6 : mPublicServerIp6;
if (!address4.empty() || !address6.empty())
{
std::string ipAddress = !address4.empty() ? address4 : address6;
if (!destV4)
{
ipAddress = !address6.empty() ? address6 : address4;
}
relayTuple = voice::Tuple(ipAddress, mRelayPort, proto::UDP);
}
}
这样就可以避免引用已销毁对象的问题了。希望这个解答对你有所帮助!
【 在 z16166 的大作中提到: 】
: 太复杂了
: 私有地址优先、ipv4优先,这就两个开关了,再加上v4、v6的地址是不是空,总共相当于4个开关,16种情况了。
: 那这个函数必须有覆盖这16种情况的单元测试用例,主要靠开发人员,不是靠黑盒测试
: ...................
--
修改:speedboy2998 FROM 218.76.62.*
FROM 218.76.62.*