我对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,但是当节点用作映射键时,计数不会增加。我在这里误解了什么吗?