CArray 的困惑之一

widewave 2001-12-05 07:24:48
我在程序中经常使用CArray模板,一直以来都对它信任有加。直到有一天出现了莫名其妙的错误。程序大致如下:
class A;
CArray<A, A&> SrcArray;
//一系列操作,为SrcArray里加入class A;
CArray<A, A&> ObjArray;
{
//检测SrcArray的值;
for(int i = 0; i < SrcArray.GetSize(); i++)
{
class A = SrcArray.GetAt(i);
}
}
ObjArray.Append(SrcArray);
{
//检测ObjArray的值;
for(int i = 0; i < ObjArray.GetSize(); i++)
{
class A = ObjArray.GetAt(i);
}
}
//结果发现SrcArray里面的对象和ObjArray里面的对象不一样。

没办法,我只好一个一个的向ObjArray里加入对象,结果正常。
不知道是怎么回事,敬请指教,多谢!
...全文
158 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kissfire 2002-02-03
  • 打赏
  • 举报
回复
呵呵,果然是高手,偷学一着!
widewave 2002-02-03
  • 打赏
  • 举报
回复
灰心丧气......
widewave 2002-02-03
  • 打赏
  • 举报
回复
结贴了。
widewave 2001-12-13
  • 打赏
  • 举报
回复
终于找到了CArray的病根:我用的是VC++4.2,VC++6.0没有此问题。
CArray::Copy(...); CArray::Append(...); 都调用了以下函数.
文件Afxtempl.h,ln76--ln88.
template <class TYPE>
inline void AFXAPI CopyElement(TYPE *pDest, const TYPE *pSrc, int nCount)
{
ASSERT(nCount == 0||
AfxIsValidAddress(pDest, nCount * sizeof(TYPE)));
ASSERT(nCount == 0||
AfxIsValidAddress(pSrc, nCount * sizeof(TYPE)));

//default is element - copy using assignment
while(nCount--)
*pDest++ = *pSDrc;
}
这个函数有明显错误:
*pDest++ = *pSDrc;//错了,只复制了第一个元素
应该改为:
*pDest++ = *pSDrc++;//OK,与VC++6.0相同

另外,如果是CString或者COleVariant类型的CArray,则不存在此问题.因为这个函数重载了CString和COleVariant类型的参数(在VC++库中,看不到);
FrankZhang123 2001-12-09
  • 打赏
  • 举报
回复
CArray没有初始值,但是class A有.CArray在Append时,有可能会重新分配内存,在它复制对象是,使用的是对象复制的缺省构造函数,问题应该出在这里,如果实在不行,你可以改用CArray存放指针,而不是对象本身,这样就不会出现这样的问题了
蒋晟 2001-12-09
  • 打赏
  • 举报
回复
它创建对象的时候是采用按位复制的,在比较复杂的类中可能出现问题(比如成员变量有一个数据指针和一个引用计数)。比较安全的办法是只存放对象指针。
widewave 2001-12-09
  • 打赏
  • 举报
回复
to : FrankZhang123(FrankZhang123) 
“在它复制对象是,使用的是对象复制的缺省构造函数”。
没错,是调用了这个函数。但是,一个一个往CArray里加入对象,不也调用了这个函数吗?为什么就不会出错呢?
widewave 2001-12-05
  • 打赏
  • 举报
回复
我问过一些人,他好象都不用CArray::Append(......);
我想如果研究一下CArray的源代码,应该会有所帮助。
widewave 2001-12-05
  • 打赏
  • 举报
回复
关注!
widewave 2001-12-05
  • 打赏
  • 举报
回复
CArray有初始值?不可能啊,不可能.CArray是一个模板,只有具体实现以后才有意义.哪里会有初始值呢?
hujun614 2001-12-05
  • 打赏
  • 举报
回复
可能是CArray有个初始值吧。

16,550

社区成员

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

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

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