Chinaunix

标题: (已解决)奇怪的问题(编程总是很多奇怪问题)。。请高人解惑救命! [打印本页]

作者: cexer    时间: 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应该不会乱序执行的吧?

被这奇怪的问题折腾很久了,哥整个人都要崩溃了,请高人救命解惑!顺便提前祝大家元旦快乐!
作者: cexer    时间: 2010-12-16 13:25

作者: foolishx    时间: 2010-12-16 13:47
Cout能直接把string打出来吗?

我一般使用cout<<string.c_str()
作者: cexer    时间: 2010-12-16 14:47
回复 3# foolishx


    能,operator<<重载了的
作者: kecise    时间: 2010-12-16 16:44
回复 1# cexer

有没有可能是编码的问题,Windows的API函数一般都分为ASCII,Unicode两种类型。
作者: phy0077    时间: 2010-12-16 18:33
child.content() 返回的临时对应的引用吧
作者: cexer    时间: 2010-12-18 02:33
回复 5# kecise


    应该没有编码问题,已如果有编码问题,只是会打印不出来,字符串内应该还是有内容,而且已经明确调用了 cout.imbue( std::locale("") )。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2