使用yaml-cpp解析YAML文件时,是否“复制”所有子节点?

时间:2011-02-23 03:43:52

标签: yaml yaml-cpp

解析yaml文件时,通常我们从解析器中获取根节点。

我想知道在解析过程之后是否可以引用根节点。如下所示。

YAML::Node* globalRoot;

void ParseDocument(filename)
{
  YAML::Parser parser(fin)
  parser.GetNextDocument(*globalRoot);
}

void myFunction()
{
  ParseDocument("myYAML.yml");

  // After the method above, we lose the parser instance since it's a local variable.
  // But if all child data is copied, below code should be safe.
  // If globalRoot is just pointing inside the parser, this could be dangerous.

  std::string stringKey;
  (*globalRoot)["myKey"] >> stringKey;
}

我可以使用上面的代码吗?

1 个答案:

答案 0 :(得分:1)

是的,确实如此 - 一旦解析Node,它就不依赖于Parser的任何内存。

也就是说,在您的示例中,您实际上从未构造globalRoot指向的节点。你需要打电话

globalRoot = new YAML::Node;

甚至更好,将其保存在std::auto_ptr等智能指针中。