节点操作符=和引用行为



我对yaml-cpp中节点分配的语义有点困惑。我假设在Node类中内置了自动引用计数,但现在我不那么确定了。

谁能给我解释一下以下内容(注意'temp'节点声明的范围):

auto content = std::string{ "Test Scalar" };
// Case [1]
YAML::Node n1;
{
    YAML::Node temp(content);
    n1[content] = temp; // Assign temp node as map value
} // <temp local variable destroyed here>
std::cout << YAML::Dump(n1) << std::endl; // No problem
// Case [2]
YAML::Node n2;
{
    YAML::Node temp(content);
    n2[temp] = 1;       // Use temp node as map key
} // <temp local variable destroyed here>
std::cout << YAML::Dump(n2) << std::endl; // Crash, key node memory has been freed
// Case [3]
YAML::Node n3, n4;
{
    YAML::Node temp(content);
    n3[content] = temp; // Assign temp node as map value
    n4[temp] = 1;       // Use temp node as map key
} // <temp local variable destroyed here>
std::cout << YAML::Dump(n3) << std::endl; // No problem
std::cout << YAML::Dump(n4) << std::endl; // No problem!!

为什么[1]可以,而[2]不行?

似乎在[3]中,将temp赋值给n3[content]可以防止在temp被销毁时,由temp局部变量引用的节点数据被释放。因此,看起来Node类确实有引用计数,但是当节点用作映射键时,计数不会增加。我是不是误解了什么?

这是yaml-cpp中的一个bug,现在已经修复了。你是正确的,在这些情况下它不应该崩溃。

请参阅项目页面中的问题

最新更新