Я пытаюсь создать функцию-член для создания объекта quickxml :: xml_document <> из строки, перегруженных для std :: string, const std :: string и const знак * произведение хорошо.RapidXml - переполнение буфера при разборе char *
Когда я пытаюсь загрузить char * напрямую, я получаю переполнение буфера, используя скопированную строку works (чего я бы хотел избежать, из-за длинных строк).
Моя система: тестирование Debian с г ++ 4.8.2
EDIT: Я знаю, что строка будет изменена rapidxml (для сопзЬ полукокса * объекты, поэтому я создаю копию (за станд :: вектор))
пример кода, который приводит к тому же переполнение следующим образом:
#include <iostream>
#include <vector>
#include "rapidxml.hpp" // RapidXml 1.13
int main() {
char * str = (char *)"<efa><departures>data</departures></efa>";
rapidxml::xml_document<> doc;
// I'd like to avoid the copying in the following code block
# if 0
std::vector<char> writable;
if (str) {
while (* str) {
writable.push_back(* str);
str++;
}
} else {
writable.push_back('\0');
}
# define str &writable[0]
# endif
std::cout << "pre" << std::endl;
doc.parse<rapidxml::parse_no_data_nodes> (str);
std::cout << "post" << std::endl;
std::cout << doc.first_node()->name() << std::endl;
}
Ответы ниже правильные, но есть более простые способы копирования строки, например: 'std :: string writable (str);' – Roddy