我一直在玩Xerces-C XML庫。Xerces-C問題;段錯誤調用對象析構函數
我有我玩這個簡單的例子。
我似乎無法讓它運行,沒有泄漏內存和沒有segfaulting。 它是一個或另一個。
當我在「清理」下刪除解析器對象時,總會發生段錯誤。
我已經嘗試使用2.8版本的庫文件的2.8 &。
注意:我把所有的異常檢查都拿出來了,我得到了和它一樣的結果。爲了便於閱讀和簡單,我從下面的代碼中刪除了它。
在那裏的任何Xerces精明的人都在意提出一些建議嗎?
我真的不能從後面的跟蹤中知道多少,它只是跳到超類析構函數中,並在那裏進行segfaulting。
回溯:
(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;
}
它可以幫助人們在零上你的問題,如果你能指出這是你的源代碼行77。也許像「//死在這裏」這樣的行尾註釋? – 2009-06-06 17:48:12
所以我不熟悉Xerces,但是你有沒有試過用RAII和std :: auto_ptr或類似的東西? 如果你想避免這種情況,我通常會以相反的順序刪除它們。在xmlParser和錯誤處理程序之間可能會發生一些奇怪的交互,因爲您在errorHandler之前刪除了xmlParser? – jdt141 2009-06-06 17:52:01
Xerces解析器不擁有它們的錯誤處理程序,所以這實際上是正確的順序。 – 2009-06-06 18:12:59