Paul的评论已经给出了正确的答案,他的解释也很有道理。因此,为了完整起见,以下是实际工作的代码(注意明确创建的内部范围(:
我刚刚遇到Xerces-C库的一个奇怪行为,我不理解。下面的代码,已经在大量的例子中看到了,对我来说是有效的:
#include <iostream>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
using namespace std;
using namespace xercesc;
int main (int argc, char* argv[])
{
try {
XMLPlatformUtils::Initialize ();
XercesDOMParser* parser = new XercesDOMParser ();
// here one might want to add some useful operations
delete parser;
XMLPlatformUtils::Terminate ();
}
catch (...) {
cout << "caught some exception" << endl;
}
return 0;
}
当然,这个代码并没有做很多有意义的事情。但它运行,特别是干净地终止。
现在,我试图避开new/delete
并切换到一个作用域对象,就像这样:
#include <iostream>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
using namespace std;
using namespace xercesc;
int main (int argc, char* argv[])
{
try {
XMLPlatformUtils::Initialize ();
XercesDOMParser parser;
// here one might want to add some useful operations
XMLPlatformUtils::Terminate ();
}
catch (XMLException& exc) {
cout << "caught an XMLException" << endl;
}
catch (...) {
cout << "caught an exception" << endl;
}
return 0;
}
此代码或类似代码也已出现多次。但是,当我运行它时,它会在(?(XMLPlatformUtils::Terminate()
之后创建一个segfault(这至少是我的调试器所建议的(。尽管如此,我还是成功地使用了以这种方式创建的解析器对象。如果我省略了对Terminate()
的调用,我会看到我的进程干净地终止。
有人知道我在这里做错了什么吗?
#include <iostream>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
using namespace std;
using namespace xercesc;
int main (int argc, char* argv[])
{
try {
XMLPlatformUtils::Initialize ();
{
XercesDOMParser parser;
// here one might want to add some useful operations
}
XMLPlatformUtils::Terminate ();
}
catch (XMLException& exc) {
cout << "caught an XMLException" << endl;
}
catch (...) {
cout << "caught an exception" << endl;
}
return 0;
}
谢谢你,保罗!