我正在尝试创建一个成员函数来设置rapidxml :: xml_document<>来自字符串的对象,std :: string的重载,const std :: string和const char *工作正常。
当我尝试直接加载char *时,我得到一个缓冲区溢出,使用复制的字符串工作(我想避免,因为长字符串)。
我的系统:使用g ++ 4.8.2进行Debian测试
编辑: 我知道字符串将被rapidxml修改 (对于 const char *对象,因此我创建了一个副本(每个std :: vector))
示例代码,产生相同的溢出:
#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;
}
答案 0 :(得分:2)
str
指向字符串文字,因此修改它是非法的。
来自docs:
function xml_document :: parse
[...]传递的字符串将由解析器[...]
修改
您可以将声明更改为
char str[] = "<efa><departures>data</departures></efa>";
答案 1 :(得分:2)
RapidXML修改输入字符串,因此传递文字会导致问题。但是,文档说Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used.
所以我想最好的方法是使用这个标志。