Я немного запутался в семантике назначения узлов в 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 ведет подсчет ссылок, но счетчик не увеличивается, когда узел используется в качестве ключа карты. Я что-то здесь неправильно понимаю?