RapidXML抛出异常
RapidXML is throwing exception
ifstream fin("tree.xml");
if (fin.fail()) return 1;
fin.seekg(0, ios::end);
size_t length = fin.tellg();
fin.seekg(0, ios::beg);
char* buffer = new char[length + 1];
fin.read(buffer, length);
buffer[length] = ' ';
fin.close();
xml_document<> doc;
doc.parse<parse_full>(buffer);
// doc.parse<0>(buffer);
delete [] buffer;
cout << "The first node is '" << doc.first_node()->name() << "'n";
for (xml_node<>* n = doc.first_node("card")->first_node(); n;
n = n->next_sibling())
{
char* v = n->value();
if (!v || !*v) v = "(empty)";
cout << n->name() << " : " << v << 'n';
}
这是我使用RapidXML为XML解析编写的代码,但它抛出异常"RapidXML::parse_error在内存位置0x0011fc20.."请建议对此进行任何修复。谢谢
您可以通过查看此链接http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1parse__error
来确定导致此问题的确切原因。特别是(粗体是我的重点)
类rapidxml: parse_error
定义于rapidxml.hpp
解析错误异常。当出现错误时,解析器会抛出此异常发生。使用what()函数获取人类可读的错误消息。使用where()函数获取指向源文本位置的指针检测到错误。
这至少可以让您发现导致异常的原因以及位置。此外,您的代码确实存在可能导致问题的问题。这是从解析函数http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c
的rapidXML描述中获取的粗体文本由我强调
根据给定的标志解析以零结尾的XML字符串。通过了字符串将被解析器修改,除非使用了Rapidxml::parse_non_destructive标志。字符串必须持久化的生命周期。如果出现错误,将抛出Rapidxml::parse_error异常。
但是在你的代码
xml_document<> doc;
doc.parse<parse_full>(buffer);
// doc.parse<0>(buffer);
delete [] buffer;
cout << "The first node is '" << doc.first_node()->name() << "'n";
您正在删除包含字符串的字符缓冲区,然后在doc
对象上调用函数。这违反了上述文档。我不确定这是否是你的异常的确切原因,但肯定删除缓冲区会导致问题。我建议使用try/catch块来捕获parse_error异常,然后使用where()
和what()
函数来查明错误。在完全完成对doc
对象的函数调用之后,还可以尝试将delete语句移动到代码的末尾,因为这也可能导致问题。
你解析的DOM对象文档是基于你在内存中的缓冲区,所以不要删除你的缓冲区或在退出前删除
- 从构造函数抛出异常时如何克服内存泄漏
- 函数如何通知用户它基于函数原型抛出异常?
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- VisualStudios 会抛出异常,而代码块不会 [C++]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- new(std::nothrow) int[n] 抛出异常
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 你能防止 std::regex 在无效表达式上抛出异常吗?
- C++子线程抛出异常
- 我们应该在抛出异常之前取消分配内存吗
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 为什么访问模板化变体作为返回值抛出异常
- 如何实现,错误分配中止而不是抛出异常
- std::p riority_queue::p op什么时候会抛出异常
- 在0x5914F3BE抛出异常(基于.dll)
- std::vector 默认构造函数可以抛出异常吗?
- 挂钩创建文件抛出异常:读取访问冲突
- Rapidxml对wchar_t内容抛出异常
- RapidXML抛出异常