YAML::Node operator= и эталонное поведение

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


person kamrann    schedule 15.08.2014    source источник


Ответы (1)


Это ошибка в yaml-cpp, которая сейчас исправлена. Вы были правы в том, что он не должен падать ни в одном из этих случаев.

См. проблему на странице проекта.

person Jesse Beder    schedule 16.08.2014
comment
Я думал, что это слишком очевидно, чтобы быть ошибкой, тем более что я новичок в yaml-cpp и легко мог использовать его неправильно. В любом случае спасибо, впечатляющая эффективность исправления ошибок! - person kamrann; 16.08.2014