免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2016 | 回复: 6
打印 上一主题 下一主题

[C++] (已解决)奇怪的问题(编程总是很多奇怪问题)。。请高人解惑救命! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-16 13:01 |只看该作者 |倒序浏览
本帖最后由 cexer 于 2010-12-18 02:58 编辑

问题已经解决,最后发现问题是智能指针当中,因为堆内存地址重用而导致指针判断失误千万的。一个智能指针保存了一个指针值,delete后这个指针被销毁了,智能指针中进行了相关标记,可是值没有清零(因为没有通知机制),判断时根据那个标记判断此指针无效,但是后来某个时候new,运行时库又给了同样地址的内存,智能指针就以为还是原来那个对象,以为它还是无效的。所以 child.content() 中判断该指针为无效,就给了一个空内容。


一个XML文件,UTF-8编码有BOM,全部内容如下:
<Element>a</Element>

自己写的解析器,解析成功以后,用如下代码打印<Element>a</Element>中的a:
1 std::string str = child.content();
2 cout<<str<<endl;

可是直接运行打印是空的,于是我在2行加断点断了一下,却看到str内容是正常的(a),并且继续执行程序打印出来正常结果。

尝试将2行改为cout<<str.length()<<endl打印显示字符串长度为0。
尝试过将cout改为printf或者MessageBoxA,还是空的。
尝试在1行和2行前加Sleep(1000),结果也是一样的。

可是在2行断下却时却总能正常打印出来,根本无法调试。确定cout.imbule( std::locale("") )是调用了的,此代码是用SDK写成,单线程,并未使用MFC或ATL之类的,操作系统简体中文XPSP3,开发环境VS2003,双核处理器是,x86应该不会乱序执行的吧?

被这奇怪的问题折腾很久了,哥整个人都要崩溃了,请高人救命解惑!顺便提前祝大家元旦快乐!

论坛徽章:
0
2 [报告]
发表于 2010-12-16 13:25 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2010-12-16 13:47 |只看该作者
Cout能直接把string打出来吗?

我一般使用cout<<string.c_str()

论坛徽章:
0
4 [报告]
发表于 2010-12-16 14:47 |只看该作者
回复 3# foolishx


    能,operator<<重载了的

论坛徽章:
0
5 [报告]
发表于 2010-12-16 16:44 |只看该作者
回复 1# cexer

有没有可能是编码的问题,Windows的API函数一般都分为ASCII,Unicode两种类型。

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
6 [报告]
发表于 2010-12-16 18:33 |只看该作者
child.content() 返回的临时对应的引用吧

论坛徽章:
0
7 [报告]
发表于 2010-12-18 02:33 |只看该作者
回复 5# kecise


    应该没有编码问题,已如果有编码问题,只是会打印不出来,字符串内应该还是有内容,而且已经明确调用了 cout.imbue( std::locale("") )。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP