RapidXML to szybki, lekki parser DOM XML C++, ale ma pewne dziwactwa.Jak naprawić problemy z właścicielem ciągów RapidXML?
Najgorszym z nich moim zdaniem jest to:
3,2 Własność łańcuchów.
Węzły i atrybuty produkowane przez RapidXml nie mają wartości nazw ani łańcuchów wartości. Oni tylko trzymają wskaźniki do nich. Ten numer oznacza, że należy zachować ostrożność, ustawiając te wartości ręcznie, używając , używając funkcji lub
xml_base::value(const Ch *)
.Należy zachować ostrożność, aby upewnić się, że czas życia ciągu znaków jest co najmniej równy długości okresu ważności węzła/atrybutu . Najprostszym sposobem na uzyskanie jest przydzielenie ciągu z memory_pool należącego do dokumentu . Użyj do tego celu funkcji
memory_pool::allocate_string()
.
Teraz rozumiem, że jest to zrobione w ten sposób dla prędkości, ale to wydaje się jak katastrofa samochodowa czeka się wydarzyć. Poniższy kod wygląda niewinnie, ale "name" i "value" są poza zakresem, gdy foo zwraca, więc dokument jest niezdefiniowany.
void foo()
{
char name[]="Name";
char value[]="Value";
doc.append_node(doc.allocate_node(node_element, name, value));
}
Sugestia używania allocate_string()
jak na pracy ręcznej, ale to tak łatwo zapomnieć.
Czy ktoś "ulepszony" RapidXML, aby uniknąć tego problemu?
Nie "poprawiam" rapidxml wbrew temu duchowi? Jest to super szybki parser, a brak własności jest kluczową częścią tego. –
OK, może "opakowanie" jest lepszym terminem. Ale nie ma nic złego w tym, że mamy * dodatkowy * "bezpieczniejszy" interfejs ... Użytkownicy będą musieli wybrać szybkość a kruchość. – Roddy
W tym przypadku nie są to "statystyka" i "wartość" statyczne na stercie, a więc mają zakres w całym programie. – Mark