您能给出重现这个问题的例子吗?听起来感觉不太可能出现这种问题啊。
@ouyang
我开始也这么想, 后来找到原因后测试了好多次,发现每次地址都被改, 代码不方便都贴出来,因为公司在用.我贴出部分来,大家看一看.
struct gameworld
{
bool bused; // 该服务器数据是否有效
CString worldname; // 服务器名
CString ChatServerUrl; // 游戏聊天服务器URL
CString StatusServerUrl; // 检查服务器状态的URL
int WorldOrder; // 服务器的序列
bool bstarted; // 该服务器是否启动
CString LoginServerURL1; // 登录服务器地址
CString LoginServerURL2;
CString QueueName1;
CString QueueName2;
CString QueueUrl1;
CString QueueUrl2;
CString LoginServerURL;
};
struct gameear
{
CString AuthServer;
CString PatchServer;
CString LauncherConfigurationServer;
gameworld pgameworld[20];
CString PatcherServerport;
CString gameearname;
int igameworldsize;
};
std::vector<pServerNode> m_pServerNodeList;
gameear agameear;
线程修改 agameear变量后, m_pServerNodeList的地址就错了. 线程并没有改m_pServerNodeList,
而把改成这样就ok了:
gameear agameear;
std::vector<pServerNode> m_pServerNodeList;
凡是有直接或间接定义复制构造函数和operator=的类都不能那么用。
比较疑惑,CString的内部实现应该是有一个char*的成员变量,如果“写入了大量的数据”的话会在堆上重新分配内存,应该不会影响他后面的变量的内存吧??怎么会出现“CString类的地址覆盖了,它前面变量的地址”呢?