近来写多线程的程序,用AfxBeginThread启动我们的全局函数,这个全局函数的param参数被我定义成一个相对复杂的struct,本以为传递param时用数组类就可搞定,可是发现只要对这个数组类的任何一个元素进行更改,数组内的所有指针元素就
都会一同指向这个新更改的元素,当然我已经通过其他渠道跳过了对CArray的使
用,但是不知道这是一个Bug还是我的错误,大伙帮我看看,部分源码如下:
...
typedef struct THREADSTRUCT//我定义的那个struct
{
CString ps;
CString un;
CString pw;
int caid;
UINT pp;
HWND hwnd;
} THREADSTRUCT;
...
CArray<THREADSTRUCT*> ats;
ats.SetSize(2);
...
THREADSTRUCT* ts=new THREADSTRUCT;
...
ts->caid=0;
ts->hwnd=GetSafeHwnd();
ts->pp=110;
ts->ps="pop.163.com";
ts->pw="pass0";
ts->un="user0";
ats.SetAt(0,ts);//这时一切正常
...
ts->caid=1;
ts->hwnd=GetSafeHwnd();
ts->pp=110;
ts->ps="mail.sina.com.cn";
ts->pw="pass1";
ts->un="user1";
ats.SetAt(1,ts);//这是发现ats.GetAt(0)和ats.GetAt(1)变得一模一样?

解决方案 »

  1.   

    ats.SetAt(0,ts);//这时一切正常
    ... // 注意!
    ts->caid=1;在“注意”之中你是否new了一个新的THREADSTRUCT结构?如果没有,当然会一样。
      

  2.   

    你在
    ts->caid=1;
    ts->hwnd=GetSafeHwnd();
    的时候,仍然是对刚才new的ts对象操作,你必须重新申请一个对象。
    使用CArray比较烦的地方是,你得自己管理内存,对new的对象最后进行delete,建议以后使用vector。