RapidXML es un analizador de DOM XML de C++ rápido y liviano, pero tiene algunos caprichos.Cómo solucionar problemas de propiedad de RapidXML String?
El peor de éstos a la mente es la siguiente:
3,2 Propiedad de cadenas.
Los nodos y atributos producidos por RapidXml no son poseen sus cadenas de nombre y valor. Ellos simplemente sostienen los punteros hacia ellos. Esto significa que debe tener cuidado cuando establezca estos valores manualmente, por usando
xml_base::name(const Ch *)
oxml_base::value(const Ch *)
funciones.Se debe tener cuidado para asegurar que vida útil de la cadena pasada está en menos tan largo como la vida de la nodo/atributo. La forma más fácil de lograrlo es asignar la cadena desde memory_pool propiedad del documento . Utilice
memory_pool::allocate_string()
función para este propósito.
Ahora, entiendo que se ha hecho así por la velocidad, pero esto se siente como un accidente automovilístico esperando a suceder. El siguiente código parece inocuo, pero 'nombre' y 'valor' están fuera del alcance cuando devuelve foo, por lo que el documento no está definido.
void foo()
{
char name[]="Name";
char value[]="Value";
doc.append_node(doc.allocate_node(node_element, name, value));
}
La sugerencia de utilizar allocate_string()
según los trabajos manuales, pero es tan fácil de olvidar.
¿Alguien ha 'mejorado' RapidXML para evitar este problema?
¿No sería mejor "rapidxml" estar en contra de su espíritu? Es un analizador súper rápido y la falta de propiedad es una parte clave de esto. –
OK, tal vez un "envoltorio" es un término mejor. Pero no hay nada intrínsecamente malo en tener una interfaz * adicional * "más segura" ... Depende de los usuarios elegir la velocidad o la fragilidad. – Roddy
En este caso, no hay "nombre" y "valor" estáticos en el montón, por lo que tienen alcance en todo el programa. – Mark