微软BUG?

sdhzzzzcd 2008-11-20 06:01:08
在使用CList时,发现调用AddTail后,(中间也会调用RemoveAt),然后调用GetHeaderPosition(),GetTailPosition(),发现有时候尾指针比头指针小,不过一般情况下尾指针比头指针大。

在调试中发现如果尾指针比头指针小时,如果采用GetHeaderPosition,GetNext或者采用GetTailPosition,GetPrev遍历所有元素都会出现异常。

实际调试现象是,这个list中有4个元素,但我在遍历到第2个元素时,其next指针的地址是0xcccccccc。

请问这是怎么回事?是CList的BUG吗?

谢谢!
...全文
150 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdkui 2008-11-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sdhzzzzcd 的回复:]
to xdkui:
CList的问题,我的代码就是和上面的一样,在我的程序中可以调试的。
CString的问题,我也感觉不可能,但是它确实发生了,没有发生内存溢出。只是每次走完CString str = g();
,就会改变那个CArray对象的数据内容,我也很奇怪。。。
[/Quote]

我调试了下, 没有问题. 建议你贴更多的代码出来, 比如USER的声明, 添加List的代码等

至于CString, 有代码吗? 可以贴个完整的出来, 看看到底什么地方出问题. MFC用了这么多年, 怎么可能有这么简单的bug
sdhzzzzcd 2008-11-23
  • 打赏
  • 举报
回复
to xdkui:
CList的问题,我的代码就是和上面的一样,在我的程序中可以调试的。
CString的问题,我也感觉不可能,但是它确实发生了,没有发生内存溢出。只是每次走完CString str = g();
,就会改变那个CArray对象的数据内容,我也很奇怪。。。
sdhzzzzcd 2008-11-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jameshooo 的回复:]
在遍历过程中执行删除节点的操作,容易使迭代器失效,或者说一旦执行了节点删除,你需要马上终止遍历过程,再从头开始遍历。
这个原则不仅适用于MFC的集合类,也使用于STL的集合类,MFC中集合类的迭代器是POSITION,STL中的迭代器是iterator。
[/Quote]
我的代码也是这样操作的呀,见我上面的代码,我找到节点后就删掉该节点,然后就
Break了。但实在搞不明白为什么会出错。
sdhzzzzcd 2008-11-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jameshooo 的回复:]
在遍历过程中执行删除节点的操作,容易使迭代器失效,或者说一旦执行了节点删除,你需要马上终止遍历过程,再从头开始遍历。
这个原则不仅适用于MFC的集合类,也使用于STL的集合类,MFC中集合类的迭代器是POSITION,STL中的迭代器是iterator。
[/Quote]
我的代码也是这样操作的呀,见我上面的代码,我找到节点后就删掉该节点,然后就
Break了。但实在搞不明白为什么会出错。
xdkui 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sdhzzzzcd 的回复:]
我的代码原型为:
bool DelUser(int id)
{
ASSERT(id >= 0);
bool ret = false;

POSITION pos = m_listUsr.GetHeaderPosition();
while(pos)
{
POSITION currPos = pos;
USER usr = m_listUsr.GetNext(pos);
if(usr.id == id)
{
m_listUsr.RemoveAt( currPos );
ret = true;
break;
}
}
return ret;
}

[/Quote]
没看出什么问题, 有完整代码可以调式吗?

[Quote=引用 10 楼 sdhzzzzcd 的回复:]
至于CString的BUG,其实是我自己认为的。也可能是我用的不对 ^_^
现象是:有一个CArray 对象占用了一块内存,我在一个函数中调用形式如下:
void f()
{
CString str = g();
}

调试中发现str所在内存地址在CArray所占内存地址中,导致改变CArray对象的数据内容。

实在是搞不明白它的内存地址为什么会占用已经分配的内存地址,就那么定性了,在这里也一块讨论讨论,欢迎发表意见!

另外问个问题:
如下形…
[/Quote]
不是吧,一般是你使用不当, 比如buffer越界

至于A g_a, 全局变量在数据段里,不在栈里
weichaogui 2008-11-21
  • 打赏
  • 举报
回复
在循环中删除元素后,重置POSITION,就可以继续GetNext。
cnzdgs 2008-11-21
  • 打赏
  • 举报
回复
同上,删除某一元素会导致剩余元素的POSITION发生变化,不能继续GetNext。
jameshooo 2008-11-21
  • 打赏
  • 举报
回复
在遍历过程中执行删除节点的操作,容易使迭代器失效,或者说一旦执行了节点删除,你需要马上终止遍历过程,再从头开始遍历。
这个原则不仅适用于MFC的集合类,也使用于STL的集合类,MFC中集合类的迭代器是POSITION,STL中的迭代器是iterator。
sdhzzzzcd 2008-11-21
  • 打赏
  • 举报
回复
至于CString的BUG,其实是我自己认为的。也可能是我用的不对 ^_^
现象是:有一个CArray 对象占用了一块内存,我在一个函数中调用形式如下:
void f()
{
CString str = g();
}

调试中发现str所在内存地址在CArray所占内存地址中,导致改变CArray对象的数据内容。

实在是搞不明白它的内存地址为什么会占用已经分配的内存地址,就那么定性了,在这里也一块讨论讨论,欢迎发表意见!

另外问个问题:
如下形式:
在A.h文件中
class A
{
int m_nId;
};
在A.cpp文件中
A g_a;

在B.cpp中
Extern A g_a;

请问类A中的m_nId是存放在静态存储区还是在栈区?
谢谢!
sdhzzzzcd 2008-11-21
  • 打赏
  • 举报
回复
我的代码原型为:
bool DelUser(int id)
{
ASSERT(id >= 0);
bool ret = false;

POSITION pos = m_listUsr.GetHeaderPosition();
while(pos)
{
POSITION currPos = pos;
USER usr = m_listUsr.GetNext(pos);
if(usr.id == id)
{
m_listUsr.RemoveAt( currPos );
ret = true;
break;
}
}
return ret;
}

我这样写代码有什么问题吗?希望各位大侠指点下,谢谢!

调试中发现:到USER usr = m_listUsr.GetNext(pos);
这个语句时,出现异常了,是因为pos指向了0xcccccccc,但目前只遍历到了第二个元素,而m_listUsr的GetCount返回4。
xdkui 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sdhzzzzcd 的回复:]
前段时间曾经遇到过一个CString的一个BUG,调了一下午才调出来是CString本身的的问题,今天又是调了一下午才调出CList的问题。[/Quote]

可以说下你提到的CString的bug吗? 谢谢

对于遍历过程中删list元素, 可以这样

for(it = list.begin(); it != list.end();)
{
//...
list::iterator itTemp = it;
++it;
list.remove(itTemp);
//...
}
linger1216 2008-11-20
  • 打赏
  • 举报
回复
CList一般出错不多.估计 还是你操作失误...
有可能删除后指针没指好~~~
贴代码出来瞧瞧
  • 打赏
  • 举报
回复
在遍历过程中不能删减CList元素 同意楼上
ilovedrv 2008-11-20
  • 打赏
  • 举报
回复
如果要是要用链表,队列等数据结构,推荐用stl,基本的数据结构都有,好处很多 ,速度快,跨平台,简介等等

另外,从你的描述中,我觉得,应该不是CList的问题,而是你用的方法有问题

有可能是在遍历CList时,调用RemoveAt之类的函数修改了CList,这样遍历是不行的,在遍历过程中不能删减CList元素
Jarrylogin 2008-11-20
  • 打赏
  • 举报
回复
一般是你使用不当吧,MFC累库都用了那么久了,要有问题造发现了
sdhzzzzcd 2008-11-20
  • 打赏
  • 举报
回复
位置不固定我可以理解,就是说是动态链表,按Next指针指向下一个元素。
但我不理解的是为什么第2个元素的next指针是0xcccccccc?(总共4个元素)
打印LOG发现,一般情况下 首指针的大小 <= 尾指针的大小
但有时候 首指针的大小 〉 尾指针的大小
在遍历元素时,如果遇到首指针的大小 〉 尾指针的大小的情况时,我的程序就出现异常了。最后虽然解决了问题,但想不明白为什么CList会出现这种现象?


前段时间曾经遇到过一个CString的一个BUG,调了一下午才调出来是CString本身的的问题,今天又是调了一下午才调出CList的问题。

谁能告诉我去哪里可以知道目前微软的类库的BUG都有哪些,以后也好注意一下,谢谢!
cnzdgs 2008-11-20
  • 打赏
  • 举报
回复
按你的描述来看是BUG。
凤矶 2008-11-20
  • 打赏
  • 举报
回复
CList就是动态链表,元素的位置是动态插入的,位置不固定。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧