的Xerces-C的问题;段错误就调用对象的析构
-
12-09-2019 - |
题
我一直使用的Xerces-C XML库玩耍。
我有这个简单的例子我与播放。
我似乎无法得到它没有内存泄漏和不运行段错误。 这是一个或另一个。
当我删除下“清理”的解析器对象的段错误总是发生。
我同时使用2.8&2.7版本库的尝试。
注意:我把所有的异常检查出的代码,我得到它,没有它同样的结果。为了可读性和简单起见,我从下面的代码删除它。
所有的Xerces精明的人在那里照顾提出一些建议?
我真的不能回溯追踪告诉多少,它只是跳下进入超析构函数和有段错误。
<强>回溯:强>
(gdb) bt
#0 0x9618ae42 in __kill ()
#1 0x9618ae34 in kill$UNIX2003 ()
#2 0x961fd23a in raise ()
#3 0x96209679 in abort ()
#4 0x95c5c005 in __gnu_cxx::__verbose_terminate_handler ()
#5 0x95c5a10c in __gxx_personality_v0 ()
#6 0x95c5a14b in std::terminate ()
#7 0x95c5a6da in __cxa_pure_virtual ()
#8 0x003e923e in xercesc_2_8::AbstractDOMParser::cleanUp ()
#9 0x003ead2a in xercesc_2_8::AbstractDOMParser::~AbstractDOMParser ()
#10 0x0057022d in xercesc_2_8::XercesDOMParser::~XercesDOMParser ()
#11 0x000026c9 in main (argc=2, argv=0xbffff460) at test.C:77
<强>代码:强>
#include <string>
#include <vector>
#if defined(XERCES_NEW_IOSTREAMS)
#include <iostream>
#else
#include <iostream.h>
#endif
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/OutOfMemoryException.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
using namespace std;
XERCES_CPP_NAMESPACE_USE
int main(int argc, char const* argv[])
{
string skXmlMetadata = "<?xml version=\"1.0\"?>\n <xmlMetadata>b</xmlMetadata>";
XMLPlatformUtils::Initialize();
XercesDOMParser* xmlParser = NULL;
DOMWriter* xmlWriter = NULL;
ErrorHandler* errHandler = NULL;
const XMLByte* xmlBuf = NULL;
MemBufInputSource* memBufIS = NULL;
DOMNode* xmlDoc = NULL;
xmlParser = new XercesDOMParser();
xmlParser->setValidationScheme( XercesDOMParser::Val_Never );
xmlParser->setDoNamespaces( false );
xmlParser->setDoSchema( false );
xmlParser->setLoadExternalDTD( false );
errHandler = (ErrorHandler*) new HandlerBase();
xmlParser->setErrorHandler( errHandler );
// Create buffer for current xmlMetadata
xmlBuf = (const XMLByte*) skXmlMetadata.c_str();
const char* bufID = "XmlMetadata";
memBufIS = new MemBufInputSource( xmlBuf, skXmlMetadata.length(), bufID, false );
// Parse
xmlParser->resetErrors();
xmlParser->parse( *memBufIS );
xmlDoc = xmlParser->getDocument();
// Write created xml to input SkArray
XMLCh* metadata = NULL;
xmlWriter = DOMImplementation::getImplementation()->createDOMWriter();
xmlWriter->setFeature( XMLUni::fgDOMWRTFormatPrettyPrint, true );
metadata = xmlWriter->writeToString( *xmlDoc );
xmlWriter->release();
// Print out our parsed document
char* xmlMetadata = XMLString::transcode( metadata );
string c = xmlMetadata;
cout << c << endl;
// Clean up
XMLString::release( &xmlMetadata );
xmlDoc->release();
delete xmlParser; // Dies here
delete memBufIS;
delete errHandler;
XMLPlatformUtils::Terminate();
return 0;
}
解决方案
“xmlDoc->释放();” 的罪魁祸首。你不拥有该节点,除非你说 “xmlParser-> adoptDocument()”
其他提示
允许探索证据...
#6 0x95c5a14b in std::terminate ()
我可以告诉你,当析构函数抛出一个异常,这就是所谓的。析构函数抛出异常是一大禁忌。的Xerces可以做一些靠不住的。
或者,它可能是由这条线引起的
#7 0x95c5a6da in __cxa_pure_virtual ()
,其中一些可能会在虚函数表中丢失。也许DOM对象的成员析构函数中的一个?也许这会生成异常?
此链接提供什么可能会导致虚拟表查找到一个很好的解释失败。总之,它可以通过一个悬空基类指针游逛有人试图使对指针的多态函数调用引起的。
这是上面的链路给出实施例
// From sample program 5:
AbstractShape* p1 = new Rectangle(width, height, valuePerSquareUnit);
std::cout << "value = " << p1->value() << std::endl;
AbstractShape* p2 = p1; // Need another copy of the pointer.
delete p1;
std::cout << "now value = " << p2->value() << std::endl;
悬摆指针的说,它看起来像XercesDomParser是抱着你newed对象:
errHandler = (ErrorHandler*) new HandlerBase();
xmlParser->setErrorHandler( errHandler )
但后来删除/释放
// Clean up
XMLString::release( &xmlMetadata );
xmlDoc->release();
delete xmlParser;
delete memBufIS;
delete errHandler;
难道你破坏东西是不正确的,秩序造成一定的上述问题?在它面前,事情看起来OK,但是这就是我会尝试,仔细检查的事情应该如何被推倒的文档。
我看不出什么明显错误的代码。你可能想尝试删除新的所有用途及代码删除,并创建Cerces对象,您基于堆栈objectys改用。例如,代替:
xmlParser = new XercesDOMParser();
使用:
XercesDOMParser xmlParser;
等。
不隶属于 StackOverflow