浪迹天涯

唯有努力...
努力....再努力...

TinyXML中奇怪的user breakpoint错误?

代码中使用了TinyXML库,在使用过程中发现一个奇怪的问题,这个问题简化描述如下:
1、编写一个lib,接口为:
void BuildXMLFile(TiXmlDocument& doc)
{
    TiXmlPrinter printer;
    printer.SetIndent( 
"" );
    doc.Accept( 
&printer );
}

2、编写一个win32控制台程序,调用这个接口:

int main()
{
    TiXmlDocument doc;
    doc.Parse( 
"<?xml version=\"1.0\" encoding=\"gb2312\" ?><xml>aaa</xml>" );
    BuildXMLFile(doc);
    return 0;
}
现象:执行到BuildXMLFile(doc)时,doc.Accept(&printer)出错,弹出user breakpoint called.....错误。


这个xml绝对没有错误(有可能贴出格式不对,因此在这缩写了),而且我如此调用并不出错(或BuildXMLFile调用后打印也不出错),只有在BuildXMLfile()内部才弹出那个对话框。

int main()
{
    TiXmlDocument doc;
    doc.Parse( 
"<?xml version=\"1.0\" encoding=\"gb2312\" ?><xml>aaa</xml>" );
    TiXmlPrinter printer;
    printer.SetIndent( 
"" );
    doc.Accept( 
&printer );
    
//BuildXMLFile(doc);
    return 0;
}

一开始我很纳闷:
首先,我并未对doc进行任何操作,只是一个doc.Accept()的操作,为什么在接口外调用就可以,在接口内部调用却不可以呢?而且,我在接口内部生成的doc,accpet操作也并不出错,真的很奇怪的一个问题,跟踪调试发现:


从堆栈中,我感觉发现了点问题,但是还不能确定是不是这个原因导致。因此发上来问问大家有没有碰过这个问题,改如何解释?

posted on 2008-09-23 10:50 浪迹天涯 阅读(2415) 评论(12)  编辑 收藏 引用 所属分类: C++

评论

# re: TinyXML中奇怪的user breakpoint错误? 2008-09-23 17:10 浪迹天涯

怎么没人发表意见?  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误?[未登录] 2008-09-23 17:38 Kevin Lynx

我用TinyXML虽然没用过TiXmlPrinter ,但是,从你的代码来看,我个人感觉就有点问题:

doc.Accept( &printer );

从接口使用来看,Accept接受了一个指针,那么doc内部可能只保存该指针,而不是完全复制printer对象,那么,在BuildXMLFile退出后,printer对象destruct。假设Document和Printer在关于Accept这个动作之间有指针所有权改变的动作,那么这个自动destruct动作就可能导致问题。

将这些代码都放在同一个作用域里不出问题,也是我做这样推断的理由之一。
  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误?[未登录] 2008-09-23 17:46 Kevin Lynx

刚我自己复制了你的代码尝试了下,
TinyXml 2.5.3 vs2005 没有出现你说的错误 = =
我也阅读了TiXmlPrinter 的文档,发现我可能说错了。
  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误? 2008-09-23 18:15 浪迹天涯

我TinyXml版本也是2.5.3 用的vc6.0
我并没有将TinyXML编译成lib库加载调用,而是将tinyxml的源文件引入工程中,这样在不同的工程中,就会受到编译选项的干扰;并且在我上面描述的接口中就会出现你所说的对象的所有权问题。我将tinyxml编译成一个dll供其它工程调用后,就不会遇到上面问题。
我没看TiXmlPrinter的文档,难道不是上面的原因吗?  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误? 2008-09-23 18:21 浪迹天涯

从堆栈中,很显然是NTDLL new出来的临时对象,被MAPTEST delete时出错。这也很明显违背了谁new谁负责delete的原则。  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误?[未登录] 2008-09-24 12:13 megax

void BuildXMLFile(TiXmlDocument& doc)
{
TiXmlPrinter printer;
printer.SetIndent( "" );
doc.Accept( &printer );
}
其中printer是临时对象,Accept接受的是指针,BuildXMLFile运行完之后printer就被销毁了。所以当然会出错?你以前是不是c#或者java程序写多了...呵呵  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误? 2008-09-24 12:35 浪迹天涯

megax:
我是一直写C++的,我没发现这样有什么不对,临时对象完全可以作为参数传递。
你可能没有理解doc.Accept()这个函数,这不是socket中的accpet,这就是一个相当于打印的函数,就是一个过程调用,doc.accept只在BuildXMLFile内调用,打印完后就销毁了,然后才是BuildXMLFile调用过程的结束。  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误? 2008-09-25 15:10 小明

你可以检查一下你的lib project和你的exe project的CRT setting么?  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误? 2008-09-25 16:04 浪迹天涯

小明:
两边setting是一样的。
我的想法和Kevin Lynx差不多,应该就是这个原因吧  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误?[未登录] 2008-09-25 17:24 Kevin Lynx

@megax
你这样说有点不对,指针参数不见得就会保存该指针。
事实上,doc确实没保存printer,粗略地看了下这块的代码,Accept纯碎是将一些信息输出到printer而已。

  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误? 2012-08-22 16:47 正站在

这个问题我遇见了,只不过,不是tinyxml的问题  回复  更多评论   

# re: TinyXML中奇怪的user breakpoint错误?[未登录] 2014-01-20 11:30 xxx

doc->Accept( &printer );  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(20)

随笔分类(30)

随笔档案(29)

文章分类

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜