YAML :: Node operator =和引用行为

时间:2014-08-15 17:14:34

标签: yaml yaml-cpp

我对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被销毁时被释放。因此,似乎Node类确实引用了count,但是当节点用作映射键时,计数不会增加。我在这里误解了什么吗?

1 个答案:

答案 0 :(得分:1)

这是yaml-cpp中的一个错误,现已修复。你是对的,因为它不会在任何这种情况下崩溃。

请参阅项目页面上的the issue